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
");
27         else printf("0
");
28     }
29 }
原文地址:https://www.cnblogs.com/qzqzgfy/p/5266771.html