Light OJ 1004 - Monkey Banana Problem---- dp题解

Sample Input

2

4

7

6 4

2 5 10

9 8 12 2

2 12 7

8 2

10

2

1

2 3

1

Sample Output

Case 1: 63

Case 2: 5


#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<cmath> using namespace std; #define INF 0x3f3f3f3f #define maxn 210 long long f[maxn]; int dp[maxn][maxn]; int Map[maxn][maxn]; int main() { int t,n; scanf("%d",&t); int k = 1; while(t--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(Map,0,sizeof(Map)); for(int i=1; i<=n; i++) for(int j = 1; j<=i; j++) scanf("%d",&Map[i][j]);//上半部分的输入 for(int i=n+1; i<=2*n-1; i++) for(int j = 1; j<=2*n-i; j++) scanf("%d",&Map[i][j]);//下半部分的输入 dp[1][1] = Map[1][1]; for(int i=1; i<=n; i++) for(int j = 1; j<=i; j++) { dp[i+1][j] = max(dp[i+1][j],dp[i][j]+Map[i+1][j]); dp[i+1][j+1] = max(dp[i+1][j+1],dp[i][j]+Map[i+1][j+1]); }//上半部分向下的时候每一个点都有两种选择。 for(int i=n+1; i<=2*n-1; i++) for(int j = 1; j<=2*n-i; j++) { dp[i][j] = max(dp[i-1][j],dp[i-1][j+1]) + Map[i][j]; }//下半部分向下走的时候每一个点都取决于它上面的两个点。 printf("Case %d: %d\n",k++,dp[2*n-1][1]); } return 0; }

 

posted @ 2016-08-03 09:00  biu~biu~biu~  阅读(118)  评论(0编辑  收藏  举报