51Nod 1002 数塔取数问题
Input示例
4 5 8 4 3 6 9 7 2 9 5
Output示例
28
DP:
递推式:
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+arr[i][j];
#include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 510 int arr[N][N],dp[N][N]; void DP(int n){ for(int i=0;i<n;i++) dp[n-1][i]=arr[n-1][i]; for(int i=n-2;i>=0;i--){ for(int j=0;j<=i;j++){ dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+arr[i][j]; } } } int main() { int n,k; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ for(int j=0;j<=i;j++){ scanf("%d",&arr[i][j]); } } DP(n); printf("%d\n",dp[0][0]); } return 0; }