HDU2089: 不要62

【传送门:HDU2089


简要题意:

  给出l,r,求出l到r中的数中不存在4或者62的数的个数


题解:

  数位DP,第一题


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int f[8][10];
void getdp()
{
    f[0][0]=1;
    for(int i=1;i<=7;i++)
    {
        for(int j=0;j<=9;j++)
        {
            if(j==4) f[i][j]=0;
            else
            {
                for(int k=0;k<=9;k++)
                {
                    if(k==2&&j==6) continue;
                    f[i][j]+=f[i-1][k];
                }
            }
        }
    }
}
int a[8];
int solve(int x)
{
    int cnt=0;
    while(x!=0)
    {
        a[++cnt]=x%10;
        x/=10;
    }
    a[cnt+1]=0;
    int ans=0;
    for(int i=cnt;i>=1;i--)
    {
        for(int j=0;j<a[i];j++)
        {
            if(j!=4&&(a[i+1]!=6||j!=2))
            {
                ans+=f[i][j];
            }
        }
        if(a[i]==4) break;
        if(a[i+1]==6&&a[i]==2) break;
    }
    return ans;
}
int main()
{
    getdp();
    int l,r;
    while(scanf("%d%d",&l,&r)!=EOF)
    {
        if(l==0&&r==0) break;
        printf("%d\n",solve(r+1)-solve(l));
    }
    return 0;
}
posted @ 2018-04-17 20:18  Star_Feel  阅读(164)  评论(0编辑  收藏  举报