1 条题解
-
2
【解题思路】:考虑使用 dp 算法,设 dp[i][j][k]表示前 i 轮中,第 i 轮出的牌为j(0<=j<=2),已经换过 k 次牌的最大得分,则
这里的a数组是奖励的得分,b数组是换牌的惩罚,c数组是小杨的出牌,result(x,y)表示出牌为 x 时和 y 的胜负情况(胜利返回 2,平局返回 1,失败返回 0)上面一行表示当前轮出牌和上一轮相同,下面一行表示不同,需要额外付出 b[k]的代价。 最终答案为:
【参考程序】:
#include <bits/stdc++.h> using namespace std; int n, a[1005], b[1005], c[1005], dp[3][1005]; int result(int x, int y) { if (x == y + 1 || x == y - 2) return 2; if (x == y) return 1; return 0; } int main() { cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 1; i < n; ++i) cin >> b[i]; for (int i = 1; i <= n; ++i) cin >> c[i]; memset(dp, 128, sizeof(dp)); for (int k = 0; k < 3; ++k) { dp[k][0] = result(k, c[1]) * a[1]; } for (int i = 2; i <= n; ++i) for (int j = i - 1; j >= 0; --j) for (int k = 0; k < 3; ++k) { int curr_score = result(k, c[i]) * a[i]; dp[k][j] = dp[k][j] + curr_score; if (j > 0) { for (int l = 0; l < 3; ++l) { dp[k][j] = max(dp[k][j], dp[l][j - 1] + curr_score - b[j]); } } } int ans = -2e9, x = 0; for (int j = 0; j < n; ++j) for (int k = 0; k < 3; ++k) { ans = max(ans, dp[k][j]); } cout << ans << endl; return 0; }
- 1
信息
- ID
- 582
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 14
- 已通过
- 8
- 上传者