HDU 1404 Digital Deletions

呵呵 写了一天。。

这题状态不多(10^6我次奥),可以用sg函数来搞一搞。

重点是不需要求sg[k]的值具体是什么啊!sg=0就是必败,sg=1就是必胜了啊!!!

那就跟正常的dfs一样了。

如果找到后续的必败态,那么当前就是必胜态了。

如果找不到后续全是必胜态了嘛。。当前肯定必败啊。。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
int sg[1000010];
int dfs(int k){
    if(sg[k]!=-1)return sg[k];
    int i,kk;
    for(i=1;i<=k;i*=10){
        if(k/i%10){
            kk=k;
            do{
                kk-=i;
                if(kk<i)break;
                if(!sg[kk])return sg[k]=1;
            }while(kk/i%10);
        }
        else if(!sg[k/i/10])return sg[k]=1;
    }
    return sg[k]=0;
}

int main(){
    char s[10];
    int i,sum;
    memset(sg,-1,sizeof(sg));
    sg[0]=1;
    for(i=1;i<1000010;i++)
        dfs(i);
    while(~scanf("%s",s)){
        if(s[0]=='0'){
            puts("Yes");
            continue;
        }
        sum=0;
        for(i=0;s[i];i++){
            sum*=10;
            sum+=s[i]-'0';
        }
        puts(sg[sum]?"Yes":"No");
    }
    return 0;
}



你可能感兴趣的:(HDU 1404 Digital Deletions)