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

posted @ 2010-09-01 21:08  open source  阅读(273)  评论(0编辑  收藏  举报