数塔问题:数字三角形,从三角形顶部往下走,只能往左下或右下走,求走到最下面时所经过的数字和最大为多少?(下图为n=6时的情况)
2 | ||||||||||
96 | 30 | |||||||||
83 | 52 | 60 | ||||||||
21 | 65 | 44 | 61 | |||||||
8 | 79 | 50 | 41 | 21 | ||||||
61 | 41 | 50 | 38 | 79 | 10 |
输入
第1行:整数n(1<=n<=1000)
第2-n+1行:每行若干整数,第i行有i-1个整数ai,空格分隔。(0<ai<108)
输出
一行:一个整数,表示所经过数字的最大和。
样例输入 Copy
6 2 96 30 83 52 60 21 65 44 61 8 79 50 41 21 61 41 50 38 79 10
样例输出 Copy
375
代码:
#include<bits/stdc++.h>
using namespace std;
int n,ans=0,a[1010][1010],dp[1010][1010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
}
}
for(int i=1;i<=n;i++){
ans=max(ans,dp[n][i]);
}
cout<<ans;
return 0;
}