#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=102; int dp[maxn][maxn]; int arr[maxn][maxn]; int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;++i) for(j=1;j<=i;++j) scanf("%d",&arr[i][j]); memset(dp,0,sizeof(dp)); dp[1][1]=arr[1][1]; for(i=2;i<=n;++i) { dp[i][1]=arr[i][1]+dp[i-1][1]; for(j=2;j<=i-1;++j) { dp[i][j]=arr[i][j]+ max(dp[i-1][j-1],dp[i-1][j]); } dp[i][i]=arr[i][i]+dp[i-1][i-1]; } int ans=-1; for(i=1;i<=n;++i) if(dp[n][i]>ans) ans=dp[n][i]; printf("%d\n",ans); } return 0; }
随便在poj的online status 看ac的题目 然后做。。
第一个就看到这个了 在lrj的第一本白书 dp专题讲的第一道题。
挺水的
对于三角形中节点 上曾有两个节点可以走到它 看从哪个节点走到 的值大就行了 最左边和最右边单独处理。只有一个节点可以走到