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]);

 }

}

你可能感兴趣的:(poj)