您的位置:首页 > 其它

poj2068 Nim(博弈|dp)

2018-02-10 14:28 363 查看
题目链接

分析:

双方都有操作集的Nim游戏

没有什么好办法,所以就想计算SG值

但是双方的操作并不等价(双方的操作集不一样)

我们没有办法直接计算SG函数

解决方法:记忆化搜索

设计状态:f[i][j]f[i][j]表示第ii个人,还有jj个石子的情况下是否能赢

直接搜索即可

终止状态:

if (rst==1) return 0;      //必败态
if (rst<=a[x]) return 1;   //必胜态


tip

真的涨姿势了

原来SG函数还可以用DP计算

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

using namespace std;

const int N=10002;
int n,m,a[25];
int f[25]
;

int dfs(int x,int rst)
{
if (x>2*n) x=1;
if (rst==1) return f[x][rst]=0;
if (rst<=a[x]) return f[x][rst]=1;
if (f[x][rst]!=-1) return f[x][rst];

for (int i=1;i<=min(rst,a[x]);i++)
if (!dfs(x+1,rst-i))             //后继状态有必败态
return f[x][rst]=1;
return f[x][rst]=0;
}

int main()
{
while (scanf("%d",&n)!=EOF&&n)
{
memset(f,-1,sizeof(f));
scanf("%d",&m);
for (int i=1;i<=2*n;i++)
scanf("%d",&a[i]);
if (dfs(1,m)) printf("1\n");
else printf("0\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: