我正在尝试编写一个程序来查找三角形的最大路径总和。路径总和是出现在从顶部到底部开始的路径上的数字的总和,因此在每个路径上,下一个数字位于下面的正下方或一个右方的位置,如下所示:< / p>
1
12
123
1234
我在互联网上看到了一种可以解决此问题的算法,但是输出仍然是数组索引[0][0]
的原始值。
这是我用C语言编写的代码:
#include<stdio.h>
int main(){
int rows,testcases;
scanf("%d",&testcases);
scanf("%d",&rows);
int a[rows][rows];
while(testcases--){
for(int i=0;i<rows;i++){
for(int j=0;j<i+1;j++)
scanf("%d",&a[i][j]);
}
for(int i=rows;i>1;i--){
for(int j=0;j<i-1;j++){
if(a[i][j]>a[i][j+1]){
a[i-1][j]=a[i-1][j]+a[i][j];
}
else{
a[i-1][j]=a[i-1][j]+a[i][j+1];
}
}
}
printf("The Largest Path Sum = %d",a[0][0]);
}
return(0);
}
我希望数组索引0 =最大和。 实际结果是原始值
答案 0 :(得分:1)
您有一个自下而上的动态编程解决方案。您的循环条件不正确。将外部循环从rows - 1
迭代到1
,将内部循环从0
迭代到i-1
。
解决方案如下:
for(int i = rows - 1;i > 0;i--){
for(int j = 0;j < i;j++){
if(a[i][j] > a[i][j+1]){
a[i-1][j] = a[i-1][j] + a[i][j];
}
else {
a[i-1][j] = a[i-1][j] + a[i][j+1];
}
}
}