| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 89072 | sh25_zhangyj | 石头剪刀布 | C++ | 解答错误 | 1 MS | 248 KB | 1960 | 2026-05-22 15:09:06 |
#include <iostream> #include <string> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 25; // dp[i][a][b][c] 表示前i回合,最近k次的出手状态为a,b,c(只记录最近k次的前一次状态) // 这里为了简化,我们用 dp[i][last] 表示第i回合的出手是last,last∈{0,1,2} 分别代表石头、剪刀、布 int dp[MAXN][3]; int val_win[3]; // 石头、剪刀、布赢了的得分 string t; // 0:石头(r), 1:剪刀(s), 2:布(c) // 赢的规则:石头(0)赢剪刀(1), 剪刀(1)赢布(2), 布(2)赢石头(0) int get_score(int round, int choice) { char comp = t[round]; int comp_id; if (comp == 'r') comp_id = 0; else if (comp == 's') comp_id = 1; else comp_id = 2; if (choice == comp_id) return 0; // 平局 if ((choice == 0 && comp_id == 1) || (choice == 1 && comp_id == 2) || (choice == 2 && comp_id == 0)) { return val_win[choice]; } return 0; // 输了 } int main() { int n, k, r, s, c; cin >> n >> k >> r >> s >> c >> t; val_win[0] = r; // 石头赢了得r分 val_win[1] = s; // 剪刀赢了得s分 val_win[2] = c; // 布赢了得c分 memset(dp, -0x3f, sizeof(dp)); // 初始化第一回合 for (int i = 0; i < 3; i++) { dp[0][i] = get_score(0, i); } for (int i = 1; i < n; i++) { for (int curr = 0; curr < 3; curr++) { int max_prev = -0x3f3f3f3f; // 前k回合的出手不能和curr相同 for (int prev = 0; prev < 3; prev++) { if (i >= k && dp[i - k][prev] == curr) continue; max_prev = max(max_prev, dp[i - 1][prev]); } dp[i][curr] = max_prev + get_score(i, curr); } } int ans = 0; for (int i = 0; i < 3; i++) { ans = max(ans, dp[n - 1][i]); } cout << ans << endl; return 0; }