题目
问题描述
(图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
思路
这道题的解决我是使用动态规划来解决的,把数据放在一个二维数组里面,可以注意到,每个数往下可选的是其正下方和后一个位置数,相反每个数被选的也就是前一个或者正上方的。从上往下推,将当前位置的最大值放在本位置存储,到最后一层后找出最后一层的最大值即可,就上面案例来说
第一行时
7
第二行时
7
10 15 由于3 8 只有7可以选,所以与7相加后放在原本位置
第三行时
7
10 15
18 16 15 中间的1可选10和15,因为15>10,所以选了15
第四行时
7
10 15
18 16 15
20 25 20 19
第五行时
7
10 15
18 16 15
20 25 20 19
24 30 27 26 24 因为最后一行最大的是30,所以最后输出30
代码
public class Main {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int length=reader.nextInt();
int[][] arr=new int[length][length];
int count=0;
for(int i=0;i<length;i++) {
for(int j=0;j<=count;j++) {
arr[i][j]=reader.nextInt();
}
count++;
}
count=1;
for(int i=1;i<length;i++) {
for(int j=0;j<=count;j++) {
if(j==0) {
arr[i][j]+=arr[i-1][j];
}else {
if(arr[i-1][j-1]>arr[i-1][j])
arr[i][j]+=arr[i-1][j-1];
else
arr[i][j]+=arr[i-1][j];
}
}
count++;
}
int max=arr[length-1][0];
for(int i=1;i<length;i++) {
if(arr[length-1][i]>max){
max=arr[length-1][i];
}
}
System.out.println(max);
}
}