[LightOJ1004]Monkey Banana Problem(dp)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LightOJ1004]Monkey Banana Problem(dp)相关的知识,希望对你有一定的参考价值。
题目链接:http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1004
题意:数塔的变形,上面一个下面一个,看清楚了直接做就行了。
上半部分转移方程dp(i,j)=max(dp(i-1,j),dp(i-1,j+1))+G(i,j)
下半部分转移方程dp(i,j)=max(dp(i-1,j-1),dp(i-1,j))+G(i,j)
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 1111; 23 int n, m; 24 int dp[maxn][maxn]; 25 int G[maxn][maxn]; 26 27 int main() { 28 // freopen("in", "r", stdin); 29 int T; 30 scanf("%d", &T); 31 for(int _ = 1; _ <= T; _++) { 32 scanf("%d", &n); 33 int cnt = 0; 34 bool flag = 0; 35 for(int i = 1; i <= 2 * n - 1; i++) { 36 if(!flag) cnt++; 37 for(int j = 1; j <= cnt; j++) { 38 scanf("%d", &G[i][j]); 39 } 40 if(cnt > n - 1) flag = 1; 41 if(flag) cnt--; 42 } 43 cnt = 0; 44 flag = 0; 45 memset(dp, 0, sizeof(dp)); 46 for(int i = 1; i <= 2 * n - 1; i++) { 47 if(!flag) cnt++; 48 for(int j = 1; j <= cnt; j++) { 49 if(i == 1 && j == 1) { 50 dp[1][1] = G[1][1]; 51 continue; 52 } 53 if(!flag) dp[i][j] = G[i][j] + max(dp[i-1][j-1], dp[i-1][j]); 54 else dp[i][j] = G[i][j] + max(dp[i-1][j+1], dp[i-1][j]); 55 } 56 if(cnt > n - 1) flag = 1; 57 if(flag) cnt--; 58 } 59 printf("Case %d: %d\n", _, dp[2*n-1][1]); 60 } 61 return 0; 62 }
以上是关于[LightOJ1004]Monkey Banana Problem(dp)的主要内容,如果未能解决你的问题,请参考以下文章
lightoj 1319 - Monkey Tradition (中国剩余定理)
(light oj 1319) Monkey Tradition 中国剩余定理(CRT)