[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
", _, dp[2*n-1][1]);
60     }
61     return 0;
62 }
原文地址:https://www.cnblogs.com/kirai/p/5579181.html