AC
2025-03-09 01:56:57
发布于:广东
2阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
string s;
int n_val, k_val;
// 使用滚动数组优化内存
vector<vector<vector<int>>> dp;
int can_win(int l, int r, int a, int b, int taken) {
if (l > r) return 0; // 无字符可取,当前玩家输
// 提前终止条件
if (a >= k_val || b >= k_val) return 0;
if (dp[l][r][a] != -1) return dp[l][r][a];
bool is_k = (taken % 2 == 0); // 当前玩家是否为小k
int result = 0;
if (is_k) {
// 小k的回合
if (s[l] == 'C' && a + 1 < k_val && !can_win(l + 1, r, a + 1, b, taken + 1)) {
result = 1;
} else if (s[l] != 'C' && !can_win(l + 1, r, a, b, taken + 1)) {
result = 1;
} else if (s[r] == 'C' && a + 1 < k_val && !can_win(l, r - 1, a + 1, b, taken + 1)) {
result = 1;
} else if (s[r] != 'C' && !can_win(l, r - 1, a, b, taken + 1)) {
result = 1;
}
} else {
// 小w的回合
if (s[l] == 'C' && b + 1 < k_val && !can_win(l + 1, r, a, b + 1, taken + 1)) {
result = 1;
} else if (s[l] != 'C' && !can_win(l + 1, r, a, b, taken + 1)) {
result = 1;
} else if (s[r] == 'C' && b + 1 < k_val && !can_win(l, r - 1, a, b + 1, taken + 1)) {
result = 1;
} else if (s[r] != 'C' && !can_win(l, r - 1, a, b, taken + 1)) {
result = 1;
}
}
dp[l][r][a] = result; // 存储结果
return result;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
cin >> n_val >> k_val;
cin >> s;
if (s.length() != n_val) {
cout << "NO" << endl; // 如果字符串长度不符合,直接输出 NO
continue;
}
// 动态分配 dp 数组,并初始化为 -1
dp.assign(n_val, vector<vector<int>>(n_val, vector<int>(k_val + 1, -1)));
int result = can_win(0, n_val - 1, 0, 0, 0);
cout << (result ? "YES" : "NO") << endl;
}
return 0;
}
这里空空如也
有帮助,赞一个