HDOJ 2089不要62 (按位DP)

题意:求n到m中有多少个数不含“4”和“62”

View Code
#include <stdio.h>
#include <string.h>
#define LEN 10
char a[LEN],b[LEN];
int n,m;
int dp[LEN][3][2];
int nextstate(int cur,int in)
{
    if(cur==2 || cur==1&&in==2 || in==4) return 2;
    return in==6;
}
int nextflag(int cur,int in,int max)
{
    if(cur==1 && in==max)   return 1;
    if(cur==1 && in>max)    return -1;
    return 0;
}
int DP(char *s,int len)
{
    memset(dp,0,sizeof(dp));
    dp[0][0][1]=1;
    for(int i=1;i<=len;i++)
    {
        for(int state=0;state<3;state++)
        {
            for(int flag=0;flag<2;flag++)
            {
                for(int j=0;j<10;j++)
                {
                    if(nextflag(flag,j,s[i]-'0')==-1)   continue;
                    dp[i][nextstate(state,j)][nextflag(flag,j,s[i]-'0')]+=dp[i-1][state][flag];
                }
            }
        }
    }
    return dp[len][2][0]+dp[len][2][1];
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0 && m==0)    break;
        n-=1;
        sprintf(a+1,"%d",n);
        sprintf(b+1,"%d",m);
        printf("%d\n",m-DP(b,strlen(b+1))-n+DP(a,strlen(a+1)));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/algorithms/p/2619188.html