码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-07-11 07:56:54      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

【编程马拉松算法目录】


【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上进行【下载>>>】

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

标签:

原文地址:http://blog.csdn.net/derrantcm/article/details/51877885

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!