Hdu 2089 数位dp

来源:互联网 发布:梦幻西游mac版快捷键 编辑:程序博客网 时间:2024/03/29 16:25
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int m,n;int p[15];int f[15][3];int w;int dfs(int pos,int s,int e){    if(pos==0)    {        if(s==0||s==1)return 1;        else return 0;    }    if(e==0&&f[pos][s]!=-1)return f[pos][s];    int ans=0;    if(e)    {        for(int i=0;i<=p[pos];i++)        {            int ss;            if(s!=2&&i==6)ss=1;            else if(s==2||i==4||(s==1&&i==2))ss=2;            else ss=0;            if(i!=p[pos])ans+=dfs(pos-1,ss,0);            else ans+=dfs(pos-1,ss,1);        }    }    else    {        for(int i=0;i<10;i++)        {            int ss;            if(s!=2&&i==6)ss=1;            else if(s==2||i==4||(s==1&&i==2))ss=2;            else ss=0;            ans+=dfs(pos-1,ss,0);        }    }    if(!e)f[pos][s]=ans;    return ans;}int func(int x){    memset(f,-1,sizeof(f));    int r=x;    w=0;    while(r)    {        p[++w]=r%10;        r/=10;    }    return dfs(w,0,1);}int main(){    while(scanf("%d%d",&m,&n))    {        if(m==0&&n==0)break;        if(m==0)cout<<func(n)<<endl;        else cout<<func(n)-func(m-1)<<endl;    }    return 0;}

原创粉丝点击