poj 2068 Nim 博弈论
思路:dp[i][j]:第i个人时还剩j个石头。
当j为0时,有必胜为1;
后继中有必败态的为必胜态!!记忆化搜索下就可以了!
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<vector> 6 #include<cstring> 7 #define inf 1e9 8 using namespace std; 9 int dp[22][10000],n,a[22]; 10 int dfs(int d,int s) 11 { 12 if(dp[d][s]!=-1) return dp[d][s]; 13 if(s==0) return dp[d][s]=1; 14 dp[d][s]=0; 15 for(int i=1;i<=a[d]&&i<=s;i++) 16 if(!dfs((d+1)%(2*n),s-i)) 17 dp[d][s]=1; 18 return dp[d][s]; 19 } 20 int main() 21 { 22 int i,j,q,k,t,s; 23 while(scanf("%d",&n)&&n){ 24 scanf("%d",&s); 25 memset(dp,-1,sizeof(dp)); 26 for(i=0;i<2*n;i++) scanf("%d",&a[i]); 27 printf("%d\n",dfs(0,s)); 28 } 29 return 0; 30 }