POJ2068 Nim 博弈论 dp

http://poj.org/problem?id=2068

博弈论的动态规划,依然是根据必胜点和必输点的定义,才明白过来博弈论的dp和sg函数差不多完全是两个概念(前者包含后者),sg函数只是mex操作处理多个博弈游戏的一种方法,mdzz要改以前的标签了。

f [ i ] [ j ] [ k ] 表示: i队伍在第j个队员取前还剩下k个石头的状态为i队伍必胜还是必输。

代码

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<ctime>
using namespace std;
const int maxn=<<;
int f[][][maxn+]={};
int a[][maxn]={};
int n,m;
int main(){
while(~scanf("%d",&n)){
if(!n)break;
scanf("%d",&m);
for(int i=;i<=*n;i++){
scanf("%d",&a[i&][(i+)/]);
}
memset(f,,sizeof(f));
for(int i=;i<=m;i++){//面对的还剩几个
for(int j=;j<;j++){//队伍
for(int k=;k<=n;k++){//第几人
if(i==){
f[j][k][i]=;
continue;
}f[j][k][i]=;
int z=j^;
int zz=j?k:(k==n?:k+);
for(int w=;w<=a[j][k];w++){
if(i<w)break;
if(!f[z][zz][i-w]){
f[j][k][i]=;
break;
}
}
}
}
}
printf("%d\n",f[][][m]);
}
return ;
}
上一篇:NBUT 1618 投放炸弹(树状数组)


下一篇:2018.09.25 bzoj1856: [Scoi2010]字符串(组合数学)