链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=18
从上向下遍历一遍.保存中间结果,.找出最后最大值即可
#include <iostream> #include <cstring> #define MAX_N 105 using namespace std; int dp[MAX_N][MAX_N]; //第i行,第i个的max_sum int a[MAX_N][MAX_N]; int n; void solve(void) { memset(dp,0,sizeof(dp)); int ans=0; dp[0][0]=a[0][0]; for(int i=0; i<n-1; i++) for(int j=0; j<=i; j++) { dp[i+1][j]=max(dp[i+1][j],dp[i][j]+a[i+1][j]); dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+a[i+1][j+1]); } for(int i=0; i<n; i++) if(ans<dp[n-1][i]) ans=dp[n-1][i]; cout<<ans<<endl; } int main() { while(cin>>n) { for(int i=0;i<n;i++) for(int j=0;j<=i;j++) cin>>a[i][j]; solve(); } return 0; }