poj2068
/***************************************************************\ *Author:Hu Wenbiao *Created Time: Wed 01 Sep 2010 08:28:40 PM CST *File Name: main.cpp *Description:记忆化搜索 \***************************************************************/ //*========================*Head File*========================*\\ #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> /*----------------------*Global Variable*----------------------*/ int n,S,M[22]; int dp[22][1<<13];//dp[i][j]第i个人在剩余j个石子的情况下他们那组的胜负 //*=======================*Main Program*=======================*// using namespace std; void dfs(int i,int s){ if(s==1){ dp[i][1]=0;//0是负,1是胜 return; } int win=0; for(int k=min(M[i],s-1);k;k--){//貌似从大到小,快一些 if(i==n){ if(dp[1][s-k]==-1) dfs(1,s-k); if(!dp[1][s-k]){ win=1; break; } } else{ if(dp[i+1][s-k]==-1) dfs(i+1,s-k); if(!dp[i+1][s-k]){ win=1; break; } } } dp[i][s]=win; } int main(){ //freopen("input","r",stdin); while(scanf("%d%d",&n,&S)!=EOF&&n){ n<<=1; memset(dp,-1,sizeof(dp));//-1是未处理的标记 for(int i=1;i<=n;i++) scanf("%d",M+i); dfs(1,S); printf("%d\n",dp[1][S]); } }