HDU 2089 不要62[数位dp]

来源:互联网 发布:js 动态时钟 编辑:程序博客网 时间:2024/06/09 23:23

数位dp简单题
dp[pos][state]表示pos位为6(state=1)或不为6(state=0)

#include<cstdio>#include<cstring>using namespace std;inline int read(){    int a=0,f=1;char c=getchar();    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}    while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}    return a*f;}int L,R;int a[10],dp[10][2];int dfs(int pos,int state,int pre){    if(pos==0) return 1;    if(!pre&&dp[pos][state]!=-1) return dp[pos][state];    int up=pre?a[pos]:9,ans=0;    for(int i=0;i<=up;++i)    {        if(i==4||(i==2&&state)) continue;        if(i==6) ans+=dfs(pos-1,1,pre&&i==up);        else ans+=dfs(pos-1,0,pre&&i==up);    }    if(!pre) dp[pos][state]=ans;    return ans;}int solve(int x){    int n=x,pos=0;    while(n) a[++pos]=n%10,n/=10;    return dfs(pos,0,1);}int main(){    memset(dp,-1,sizeof(dp));    L=read(),R=read();    while(L||R)    {        printf("%d\n",solve(R)-solve(L-1));        L=read(),R=read();    }    return 0;}
原创粉丝点击