您的位置:首页 > 其它

SHU-“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛-I-丢史蒂芬妮

2017-07-13 02:33 423 查看
ACM模版

描述



题解

与其说是博弈论问题,不如说是伪装成博弈论的记忆化搜索问题,通过记忆化搜索来预处理出来所有状态,然后直接访问即可。

代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 555;

int n, m;
int prime[MAXN];
bool dp[MAXN][MAXN];
int vis[MAXN][MAXN];

bool dfs(int x, int y)
{
if (vis[x][y])
{
return dp[x][y];
}
vis[x][y] = true;
for (int i = 1; i <= prime[0]; i++)
{
if (x - prime[i] > 0)
{
dp[x][y] |= (!dfs(x - prime[i], y));
}
if (y - prime[i] > 0)
{
dp[x][y] |= (!dfs(x, y - prime[i]));
}
if (x - prime[i] > 0 && y - prime[i] > 0)
{
dp[x][y] |= (!dfs(x - prime[i], y - prime[i]));
}
}

return dp[x][y];
}

void init()
{
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= MAXN; i++)
{
if (!prime[i])
{
prime[++prime[0]] = i;
}
for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++)
{
prime[prime[j] * i] = 1;
if (i % prime[j] == 0)
{
break;
}
}
}

for (int i = 1; i < MAXN; i++)
{
for (int j = 1; j < MAXN; j++)
{
dfs(i, j);
}
}
}

int main()
{
init();

int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
puts(dp
[m] ? "Sora" : "Shiro");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs dp
相关文章推荐