hdu 1404 Digital Deletions

http://acm.hdu.edu.cn/showproblem.php?pid=1404

DP  +  博弈论

找奇异状态  能到达奇异状态的为 非奇异状态  怎么走都到非奇异状态的为奇异状态

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<vector>

#include<queue>

#include<map>

#include<stack>

#include<algorithm>



using namespace std;

//#pragma comment(linker,"/STACK:1000000000,1000000000")



#define LL long long



const int INF=0x3f3f3f3f;

const int N=10000000;

short int fail[N];

int dp(int x)

{

    if(fail[x]!=0)

    return fail[x];

    if(x<10)

    {

        if(x==1)

        fail[x]=1;

        else

        fail[x]=-1;

        return fail[x];

    }

    for(int i=x,k=1;i>1;i=i/10,k=k*10)

    {

        int w=i%10;

        for(int j=1;j<w;++j)

        {

            if(dp(x-j*k)==1)

            fail[x]=-1;

        }

        if(w==0)

        {

            if(dp(i/10)==1)

            fail[x]=-1;

            continue;

        }

        if(i>=10)

        {

            if(dp(x-w*k)==1)

            fail[x]=-1;

        }

    }

    if(fail[x]==0)

    fail[x]=1;

    return fail[x];

}

int main()

{

    //freopen("data.txt","r",stdin);

    memset(fail,0,sizeof(fail));

    char s[10];

    while(gets(s))

    {

        if(s[0]=='0')

        {printf("Yes\n");continue;}

        int k=1;

        for(int i=0;s[i]!='\0';++i)

        {

            k=k*10+s[i]-'0';

        }

        if(dp(k)==1)

        printf("No\n");

        else

        printf("Yes\n");

    }

    return 0;

}

 

你可能感兴趣的:(git)