【编程马拉松】【025-数字三角形 】

【编程马拉松算法目录】


【025-数字三角形 】【工程下载>>>】


1 题目描述


    7
   3 8
  8 1 0
 2 7 4 4
4 5 2 6 5

  如上图所示,从一个数字三角形的顶部走到底部有很多条不同的路径,规则是只能从当前节点走到下一层相邻的节点,即下一层的左边或右边。例如第三行第二个数字“1”只能走到第四行的第二个数字“7”与第三个数字“4”。

  请寻找最佳一条路径,使得这条路径上节点的数字总和最大。

1.1 输入描述:



  输入包含多组。每组数据的第一行包含一个正整数n(1≤n≤100),代表三角形的层数。

  紧接着有n行数字,第i(1≤i≤n)行包含i个自然数。

1.2 输出描述:



  对应每组数据,输出最大的和。

1.3 输入例子:


    7
   3 8
  8 1 0
 2 7 4 4
4 5 2 6 5

1.4 输出例子:


30

2 解题思路



  将示例的输入转换成二维数组。如图1所示。

  图1 数据流动图

  根据意思和图1分分析,本题可以使用动态规划解决。设有待求最大值的矩阵matrix,它有n行,第i行最多i列,每个元素的值都是正数。第i(从1开始计算)行第j(从1开始计算)列对应到matrix的位置为matrix[i-1][j-1]。

第一列,它的第一行只有一个元素,它的最大值就是其自身,对于其它行,第一列的最大值等于它上一个元素的最大值加上当前值。对象线上的元素,除第一个元素外,其它元素的最大值等于它的左上角元素的最大值和当前值的和。最后对矩阵中的其它元素,其最大值等于左上角元素的最大值和上方元素的最大两都取较大的,再和当前值相加。对于matrix[i][j]有递推方程

matrix[i][j]=?????????matrix[i][j]matrix[i?1][j]+matrix[i][j](matrix[i?1][j?1]+matrix[i][j]max{matrix[i?1][j?1],matrix[i?1][j]}+matrix[i][j]i=0andj=0i>0andj=0i=j>0i>j>0

  最后,要求出matrix中的最大值只要遍历最后一列,它们中的最大值就是所求的matrix的最大值。

3 算法实现


import java.util.Scanner;

/**
 * Author: 王俊超
 * Time: 2016-05-13 17:06
 * CSDN: http://blog.csdn.net/derrantcm
 * Github: https://github.com/Wang-Jun-Chao
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int[][] matrix = new int[n][];
            for (int i = 1; i <= n; i++) {
                matrix[i - 1] = new int[i];
                for (int j = 0; j < i; j++) {
                    matrix[i - 1][j] = scanner.nextInt();
                }
            }

            System.out.println(maxSum(matrix));
        }

        scanner.close();
    }

    /**
     * 找最大值
     *
     * @param matrix 正数对角矩阵
     * @return 最大值
     */
    private static int maxSum(int[][] matrix) {

        int row = matrix.length;

        // 第一个元素不用求最大值

        // 求第一列和对象线最大值
        for (int i = 1; i < row; i++) {
            matrix[i][0] += matrix[i - 1][0];
            matrix[i][i] += matrix[i - 1][i - 1];
        }

        // 最其它元素的最大值
        for (int i = 2; i < row; i++) {
            for (int j = 1; j < i; j++) {
                matrix[i][j] += Math.max(matrix[i - 1][j - 1], matrix[i - 1][j]);
            }
        }

        int max = Integer.MIN_VALUE;

        // 找最大值
        for (int i = 0; i < row; i++) {
            if (max < matrix[row - 1][i]) {
                max = matrix[row - 1][i];
            }
        }
        return max;
    }
}

4 测试结果



5 其它信息



因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】

时间: 2024-11-23 19:22:52

【编程马拉松】【025-数字三角形 】的相关文章

【编程马拉松】【009-数根】

[编程马拉松算法目录>>>] [009-数根][工程下载>>>] 1 题目描述 数根可以通过把一个数的各个位上的数字加起来得到.如果得到的数是一位数,那么这个数就是数根:如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来.如此进行下去,直到得到是一位数为止. 比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根.再比如39,把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,这是一个一位数,因此3是39的数根.

【编程马拉松】【006-统计一】

[编程马拉松算法目录>>>] [006-统计一][工程下载>>>] 1 题目描述 NewCode总是力争上游,凡事都要拿第一,所以他对"1"这个数情有独钟.爱屋及乌,他也很喜欢包含1的数,例如10.11.12.--. 例如:N=2,1.2出现了1个"1".N=12,1.2.3.4.5.6.7.8.9.10.11.12.出现了5个"1".你能帮他统计一下整数里有多少个1吗? 1.1 输入描述: 输入有多组数据,每

【编程马拉松】【007-循环数】

[编程马拉松算法目录>>>] [007-循环数][工程下载>>>] 1 题目描述 142857是一个六位数,我们发现: 142857*1=142857 142857*2=285714 142857*3=428571 142857*4=571428 142857*5=714285 142857*6=857142 即用1到6的整数去乘142857,会得到一个将原来的数首尾相接循环移动若干数字再在某处断开而得到的数字. 也就是说,如果把原来的数字和新的数字都首尾相接,他们得到

【编程马拉松】【008-快到碗里来】

[编程马拉松算法目录>>>] [008-快到碗里来][工程下载>>>] 1 题目描述 小喵们很喜欢把自己装进容器里的(例如碗),但是要是碗的周长比喵的身长还短,它们就进不去了.现在告诉你它们的身长,和碗的半径,请判断一下能否到碗里去. 1.1 输入描述: 输入有多组数据.每组数据包含两个整数n (1≤n≤2^128) 和r (1≤r≤2^128),分别代表喵的身长和碗的半径.圆周率使用3.14. 1.2 输出描述: 对应每一组数据,如果喵能装进碗里就输出"Ye

编程马拉松大赛试题及代码(C++实现)

前段时间牛客网举办了编程马拉松大赛,总共86道题,20天内完成.题目难度难中易都有.我发现这些题目,主要关注性能和思维.很多题目用常规方法是不能通过时间要求的.题目是来自于各大oj以及面试题.所以非常适合面试前的练手. 大赛地址:http://www.nowcoder.com/ta/hackathon不知道以后还可不可以用.反正结束了. 这里我贴出一些试题和我做的代码~ NowCoder猜想 题目描述 nowcoder在家极度无聊,于是找了张纸开始统计素数的个数. 设函数f(n)返回从1-n之间

2018.01.01(数字三角形,最长上升子序列等)

2017.12.24  简单的动态规划 1.数字三角形(算法引入) 题目描述:下图所示是一个数字三角形,其中三角形中的数值为正整数,现规定从最顶层往下走到最底层,每一步可沿左斜线向下或右斜线向下走.设三角形有n层,编程计算出从顶层到底层的一条路径,使得该路径上的和最大,输出最大值.(n<=100) 思路&&代码(搜索回溯): #include <stdio.h> #include <math.h> #include <string.h> int m

数字三角形

数字三角形必须经过某一个点,使之走的路程和最大 输入格式: 第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点 输出格式: 输出最大值 样例1 输入: 2 1 1 1 1 1 输出: 2 //11 月 23 日 2015 #include <stdio.h> int num[26][26];//存储数字三角形的权值 int route[26][2];//记录临时最优路径 int n; int s1,s2;//以特殊点分为上半段和下半

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3