题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
思路:要求从顶到底的最大值,可以反过来考虑,从底部向上。
只有下面一行的最大值确定,这一行的最大值才能确定。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 120; int a[maxn][maxn],dp[maxn][maxn],n; int main(void) { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=i;j++) scanf("%d",&a[i][j]); for(i=1;i<=n;i++) dp[n][i]=a[n][i]; for(i=n-1;i>=1;i--) for(j=1;j<=i;j++) dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]); printf("%d ",dp[1][1]); } return 0; }