转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents by---cxlove
题目:三堆石头,每次从一堆中取走若干,或者从两堆中取走相同的数量 ,最后取的人胜。
博弈DP,dp[i][j][k]表示三堆石头分别为i,j,k状态时候是否为必胜。
之后便是N,P态的转换,成必败态能到达的一定是必胜态。
不能用记忆化搜索,常数太大,会TLE,递推跑了3S多。
而且还卡内存,不能用int,要用bool型。
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<vector>
#define C 240
#define TIME 10
#define inf 1<<25
#define LL long long
using namespace std;
bool dp[301][301][301]={0};
void Init(){
for(int i=0;i<=300;i++){
for(int j=0;j<=300;j++){
for(int k=0;k<=300;k++){
if(!dp[i][j][k]){
for(int r=1;r+i<=300;r++)
dp[i+r][j][k]=1;
for(int r=1;r+j<=300;r++)
dp[i][j+r][k]=1;
for(int r=1;r+k<=300;r++)
dp[i][j][k+r]=1;
for(int r=1;r+j<=300&&r+i<=300;r++)
dp[i+r][j+r][k]=1;
for(int r=1;r+j<=300&&r+k<=300;r++)
dp[i][j+r][k+r]=1;
for(int r=1;r+k<=300&&r+i<=300;r++)
dp[i+r][j][k+r]=1;
}
}
}
}
}
int main(){
int a,b,c;
Init();
while(cin>>a>>b>>c)
cout<<dp[a][b][c]<<endl;
return 0;
}