poj2068--Nim
题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略。
DP,dp[i][j]代表第i个人还有J个石子没有取得状态。记忆化搜索
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 int dp[22][9005],s,n,a[9005]; 8 int dfs(int x,int f){ 9 if (dp[x][f]!=-1) return dp[x][f]; 10 for (int i=1;i<=a[x];i++){ 11 int t=f-i,y; 12 if (t<0) break; 13 if (x+1>=2*n) y=0;else y=x+1; 14 if (dfs(y,t)==0) return dp[x][f]=1; 15 } 16 return dp[x][f]=0; 17 } 18 int main(){ 19 while (scanf("%d",&n)&&n){ 20 scanf("%d",&s); 21 for (int i=0;i<2*n;i++) 22 scanf("%d",&a[i]); 23 memset(dp,-1,sizeof dp); 24 for (int i=0;i<2*n;i++) dp[i][0]=1; 25 int ans=dfs(0,s); 26 if (ans) printf("1\n"); 27 else printf("0\n"); 28 } 29 }