试题描述
|
SX数学很强,所以把数学问题都交给她了。还是那个数字三角形(共 n 行,第 i 行有 i 个数),从第一行走到第 n 行,每一步只有两种选择,要么往正下走一步,要么往右下走一步。必须经过某一个点,使所走过的的点的数字之和和最大。各行的数都从最左开始,若一行有多个数则两两之间用一个空格分隔。 |
输入
|
第 1 行包含一个数 n,表示共有 n 行,第 2 到 n+1 行为每个的数值,路程必须经过坐标点(n/2,n/2)。
|
输出
|
一个数,表示题目要求的最大值。
|
输入示例
|
2
1 1 1 |
输出示例
|
2
|
其他说明
|
数据范围:1<=n<=100,三角形中各个数均不超过100。
|
和动态的数字三角形是一个系列,并且是升级版
1 #include <iostream> 2 3 using namespace std; 4 int a[101][101],b[101][101]; 5 int main() 6 { 7 int n,i,j; 8 scanf("%d",&n); 9 for(i=1;i<=n;i++) 10 for(j=1;j<=i;j++) scanf("%d",&a[i][j]); 11 for(i=1;i<n/2;i++) a[n/2][i]=0; 12 for(i=1;i<=n;i++) 13 { 14 for(j=1;j<=i;j++) 15 { 16 if(a[i-1][j-1]>a[i-1][j]) b[i][j]=a[i][j]+b[i-1][j-1]; 17 else b[i][j]=a[i][j]+b[i-1][j]; 18 } 19 } 20 int ans=0; 21 for(i=1;i<=n;i++) 22 if(b[n][i]>ans) ans=b[n][i]; 23 printf("%d",ans); 24 return 0; 25 }
我们发现,坐标点(n/2,n/2)就是第n/2行的最后一个点,所以在搜索前,把那一行的其他数都清零就好了。这样保证会走到那个位置