papamelong 306. 撿蘋果 Apple Catching(挑戰程式設計競賽)
阿新 • • 發佈:2022-05-29
地址 https://www.papamelon.com/problem/306
樣例 1
輸入
7 2
2
1
1
2
2
1
1
輸出
6
解答
動態規劃
dp[x][y][z] 表示 第x分鐘移動y次在z的樹下能得到最大的蘋果
#include <iostream> #include <algorithm> #include <memory.h> using namespace std; const int N = 1010; const int M = 35; int dp[N][M][3]; /* 7 2 2 1 1 2 2 1 1 */ int t, w; int tree[N]; int main() { cin >> t >> w; for (int i = 1; i <= t; i++) { cin >> tree[i]; } for(int j = 0;j < N;j++){ for (int i = 0; i < M; i++) { dp[j][i][1] = -9999999; dp[j][i][2] = -9999999; } } dp[0][0][1] = 0; for (int i = 1; i <= t; i++) { for (int j = 0; j <= w; j++) { if (tree[i] == 1) { dp[i][j][1] = dp[i - 1][j][1] + 1; dp[i][j][2] = dp[i - 1][j][2]; if (j >= 1) { dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-1][2]+1); } } else { dp[i][j][1] = dp[i - 1][j][1]; dp[i][j][2] = dp[i - 1][j][2] + 1; if (j >= 1) { dp[i][j][2] = max(dp[i][j][2],dp[i-1][j-1][1]+1); } } } } int ans = -1; for (int i = 0; i <= w; i++) { ans = max(ans, dp[t][i][1]); ans = max(ans, dp[t][i][2]); } cout << ans << endl; return 0; }