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;
}
原文地址:https://www.cnblogs.com/liulangye/p/2717905.html