[COCI2021-2022#1] Kamenčići
[COCI2021-2022#1] Kamenčići
题意
有一排石头,石头有红色和蓝色。
Alice 和 Bob 轮流从两端取石头,Alice 先手。
谁先去出
思路
先考虑搜索,记录当前区间,Alice 和 Bob 的红色石头个数,回合数。
再考虑记忆化,但
发现只需要 Alice 的红色石头个数,Bob 的个数可以通过计算得出。
时/空间复杂度:
代码
#include <bits/stdc++.h>
using namespace std;
int n, k, s1[351], s2[351];
string S;
bool dp[351][351][351][2];
bool dfs(int l, int r, int k1, int state) {
if (dp[l][r][k1][state]) return dp[l][r][k1][state];
int k2 = s1[l - 1] + s2[r + 1] - k1;
if (!state) {
if (k1 == k) return 0;
if (k2 == k) return 1;
return dp[l][r][k1][state] =
(!dfs(l, r - 1, k1 + (S[r - 1] == 'C'), state ^ 1)
|| !dfs(l + 1, r, k1 + (S[l - 1] == 'C'), state ^ 1));
} else {
if (k2 == k) return 0;
if (k1 == k) return 1;
return dp[l][r][k1][state] =
(!dfs(l, r - 1, k1, state ^ 1)
|| !dfs(l + 1, r, k1, state ^ 1));
}
}
int main() {
cin >> n >> k >> S;
for (int i = 0; i < S.size(); i ++)
s1[i + 1] = s1[i] + (S[i] == 'C');
reverse(S.begin(), S.end());
for (int i = 0; i < S.size(); i ++)
s2[i + 1] = s2[i] + (S[i] == 'C');
reverse(S.begin(), S.end());
reverse(s2 + 1, s2 + n + 1);
cout << (dfs(1, n, 0, 0) ? "DA" : "NE");
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18413219,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效