题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 15079 | Accepted: 6961 |
Description
V A S E S |
||||||
1 |
2 |
3 |
4 |
5 |
||
Bunches |
1 (azaleas) |
7 | 23 | -5 | -24 | 16 |
2 (begonias) |
5 | 21 | -4 | 10 | 23 | |
3 (carnations) |
-21 |
5 | -4 | -20 | 20 |
Input
Output
Sample Input
3 5 7 23 -5 -24 16 5 21 -4 10 23 -21 5 -4 -20 20
Sample Output
53
开始没注意全为负数的情况,wa
状态转移方程:
dp[i][j] = num[i][j] + max(dp[i-1][1],dp[i-1][2],...dp[i-1][j-1]);
我们用opt定义以当前I j为结尾的花的排序的最大值,用r*(-50)表示负无穷,初始化时第一行为origin[i][j],后面为r*(-50)
Opt[][] |
1 |
2 |
3 |
4 |
5 |
1 |
7 |
23 |
-5 |
-24 |
16 |
2 |
-150 |
-150 |
-150 |
-150 |
-150 |
3 |
-150 |
-150 |
-150 |
-150 |
-150 |
从第二行开始,对于第i行第j列,对于i>=j,遍历i-1行前j列,求出当前最大值。
Opt[][] |
1 |
2 |
3 |
4 |
5 |
1 |
7 |
23 |
-5 |
-24 |
16 |
2 |
-150 |
21+7 |
-4+max(7,23) |
10+max(7,23,-24) |
23+max(…) |
3 |
-150 |
-150 |
-150 |
-150 |
-150 |
I=3:
Opt[][] |
1 |
2 |
3 |
4 |
5 |
1 |
7 |
23 |
-5 |
-24 |
16 |
2 |
-150 |
28 |
19 |
33 |
46 |
3 |
-150 |
-150 |
-4+max(-150,28) |
-20+max() |
20+max(-150,28,19,33) |
题解:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { freopen("in.txt","r",stdin); int num[105][105]; int dp[105][105]; int n, m, i, j; cin >> n >> m; for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { cin >> num[i][j]; } } for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { if(i == 1) dp[1][j] = num[1][j]; else dp[i][j] = -50 * n; } } for(i = 2; i <= n; i++) { for(j = 1; j <=m; j++) { if(j >= i) { for(int k = 1; k < j; k++) { if(dp[i][j] < dp[i-1][k] + num[i][j]) dp[i][j] = dp[i-1][k] + num[i][j]; } } } } int ans = -999999; for(i = 1; i <= m; i++) { ans = max(ans, dp[n][i]); } cout << ans << endl; }