HDU 2089 不要62 还是基础数位dp

来源:互联网 发布:淘宝贷利息多少 编辑:程序博客网 时间:2024/04/30 21:28
不含4,并且不含62的数被称为吉祥数,题意就是给你一个区间,要你求这个区间里一共有多少个吉祥数
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int dp[21][4];void init(){    memset(dp,0,sizeof(dp));    dp[0][0]=1;    for(int i=1;i<=6;i++)    {         dp[i][0]=dp[i-1][0]*9-dp[i-1][1];               // 不含62和4         dp[i][1]=dp[i-1][0];                            //不含62和4但是以2开头         dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];   // 含有62或4的个数    }}int slove(int x){    int bit[1000],len=0,flag=0,ans=0,temp=x;    while(x)    {        bit[++len]=x%10;        x/=10;    }    bit[len+1]=0;    for(int i=len;i>0;i--)    {        ans+=dp[i-1][2]*bit[i];        if(flag)        ans+=dp[i-1][0]*bit[i];        if(!flag && bit[i]>4)        ans+=dp[i-1][0];        if(!flag && bit[i]>6 )        ans+=dp[i-1][1];        if(!flag && bit[i+1]==6 & bit[i]>2)        ans+=dp[i][1];        if(bit[i]==4 || (bit[i]==2 && bit[i+1]==6))         flag=1;    }    return temp-ans;}int main(){    init();    int a,b;    while(~scanf("%d%d",&a,&b),a+b)    {        int len1,len2;        len1=len2=0;        printf("%d\n",slove(b+1)-slove(a));    }    return 0;}


原创粉丝点击