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