1 solutions
-
0
C++ :
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n; ll sco[1005]; // 得分数组 ll loss[1005]; // 失分数组(前缀和) ll arr[1005]; // 对手 n 轮出牌 ll dp[1005][3][1005]; // dp[i][j][k]: 第 i 场,出 j,换牌 k 次的最大分数 int main() { cin >> n; for (int i = 1; i <= n; i ++) cin >> sco[i]; // 得分数组 for (int i = 1; i < n; i ++) { // 换牌至多只有 n-1 次 cin >> loss[i]; loss[i] += loss[i - 1]; // 预处理前缀和 } for (int i = 1; i <= n; i ++) cin >> arr[i]; // 输入对手的出牌方案 for (int i = 1; i <= n; i ++) { // 状态转移 for (int k = 0; k < i; k ++) { // 注意 k 只需要枚举到 i-1 if (arr[i] == 0) { dp[i][0][k] = max(dp[i - 1][0][k], max(dp[i - 1][1][k - 1], dp[i - 1][2][k - 1]))+ sco[i]; dp[i][1][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k], dp[i - 1][2][k - 1])) + 2 * sco[i]; dp[i][2][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k - 1], dp[i - 1][2][k])); } else if (arr[i] == 1) { dp[i][0][k] = max(dp[i - 1][0][k], max(dp[i - 1][1][k - 1], dp[i - 1][2][k - 1])); dp[i][1][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k], dp[i - 1][2][k - 1])) + sco[i]; dp[i][2][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k - 1], dp[i - 1][2][k])) + 2 * sco[i]; } else if (arr[i] == 2) { dp[i][0][k] = max(dp[i - 1][0][k], max(dp[i - 1][1][k - 1], dp[i - 1][2][k - 1])) + 2 * sco[i]; dp[i][1][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k], dp[i - 1][2][k - 1])); dp[i][2][k] = max(dp[i - 1][0][k - 1], max(dp[i - 1][1][k - 1], dp[i - 1][2][k])) + sco[i]; } } } // 统计答案 ll ans = 0; for (int k = 0; k < n; k ++) { for (int j = 0; j < 3; j ++) { ans = max(ans, dp[n][j][k] - loss[k]); } } cout << ans << endl; return 0; }
- 1
Information
- ID
- 9175
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By