标签:
题意:有个一维棋盘,两人轮流下棋,然后谁连成三个谁赢
记得去年fj夏令营有见过这题,但是太弱了, 不会做。
记忆化搜索,如果n<=3肯定先手必胜,递推即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 int sg[2005],n; 8 int dfs(int n){ 9 if (sg[n]!=-1) return sg[n]; 10 if (n<=3) return sg[n]=1; 11 int h[2005]; 12 memset(h,0,sizeof h); 13 for (int i=1;i<=n;i++){ 14 if (i>3){ 15 if (i<n-2) 16 h[dfs(n-i-2)^dfs(i-3)]=1; 17 else 18 h[dfs(i-3)]=1; 19 } 20 else{ 21 if (i<n-2) 22 {h[dfs(n-i-2)]=1;} 23 else 24 h[0]=1;} 25 } 26 int i; 27 for (i=0;h[i];i++); 28 return sg[n]=i; 29 } 30 int main(){ 31 memset(sg,-1,sizeof sg); 32 while (~scanf("%d",&n)){ 33 if (dfs(n)) printf("1\n");else printf("2\n");} 34 }
标签:
原文地址:http://www.cnblogs.com/qzqzgfy/p/5266829.html