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
",dfs(0,s));
28     }
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3317536.html