蓝桥杯 数字三角形

问题描述
  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;


  .
  (图3.1-1)
输入格式
  文件中首先读到的是三角形的行数。

  接下来描述整个三角形
输出格式
  最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
 
 
 
 

1.题目分析

  • 这是简单的动态规划题目,计算到每一层的每个结点的最大值。
  • 输出最后一层中值最大的那个结点的值。

 

2.代码如下

import java.util.*;;
public class Main {
    
    private static int[][] nums;
    private static int[][] sums;
    public static void main(String[] args) {
        
        Scanner is=new Scanner(System.in);
        while(is.hasNextInt()) {
            int n=is.nextInt();
            nums=new int[n+1][];
            sums=new int[n+1][];
            
            for(int i=1;i<=n;i++) {
                nums[i]=new int[i+1];
                sums[i]=new int[i+1];
                for(int j=1;j<=i;j++) {
                    nums[i][j]=is.nextInt();
                    int maxl=0;
                    if(exist(i-1,j-1,n)) {
                        maxl=sums[i-1][j-1];
                        if(exist(i-1,j,n))
                            maxl=max(maxl,sums[i-1][j]);
                    }else if(exist(i-1,j,n))
                        maxl=sums[i-1][j];
                    sums[i][j]=nums[i][j]+maxl;
                }
            }
            int a=sums[n][1];
            for(int j=2;j<=n;j++)
                a=a<sums[n][j]?sums[n][j]:a;
            System.out.println(a);
        }
        is.close();
    }

    private static boolean exist(int i,int j,int n) {
        if((i>=1&&i<=n)&&(j>=1&&j<=i))
            return true;
        return false;
    }
    private static int max(int a,int b) {
        return a>b?a:b;
    }

}

 

posted @ 2018-03-19 16:05  即便那总是过去  阅读(438)  评论(0编辑  收藏  举报