从低端向上,每个结点取下一层左右结点最大值和本身价值相加,dp[0][0]为最后结果
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; #define MAXN 510 typedef long long LL; LL a[MAXN][MAXN],dp[MAXN][MAXN]; LL sum = 0,level; int main() { int i,j; scanf("%lld",&level); for(i=0;i<level;i++) for(j=0;j<=i;j++) scanf("%lld",&a[i][j]); for(i=level-1;i>=0;i--) dp[level-1][i] = a[level-1][i]; for(i=level-2;i>=0;i--) { for(j=0;j<=i;j++) { dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+a[i][j]; //printf("%lld ",dp[i][j]); } } printf("%lld ",dp[0][0]); return 0; }