这题的中间状态比较好想。但是边界有点绕人。原因是子游戏出现了边界,未定义的情况。
import java.util.*;
public class Main {
/**
* @param args
*/
static int[] dp=new int[2001];
public static int DP(int a){
if(a<=0) return 0;
if(dp[a]!=-1) return dp[a];
int[] hash=new int[2000];
int tmp=0;
for(int i=1; i<=a; ++i){
tmp=DP(i-3)^DP(a-i-2);
hash[tmp]=1;
}
int i;
for(i=0; i<2000; ++i){
if(hash[i]!=1)
break;
}
return i;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Arrays.fill(dp, -1);
for(int i=0; i<=2000; ++i)
dp[i]=DP(i);
Scanner cin=new Scanner(System.in);
while(cin.hasNextInt()){
int t;
t=cin.nextInt();
if(dp[t]==0)
System.out.println("2");
else
System.out.println("1");
}
}
}