HDU 2089 不要62(数位DP)

来源:互联网 发布:ug8.0编程教程入门 编辑:程序博客网 时间:2024/05/19 16:35

跟这一篇差不多 http://blog.csdn.net/qq_27925701/article/details/50650199

#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))//0 不含//1 不含且最高位是2//2 含不吉利数字 int dp[25][3];void init(){    dp[0][0]=1;    dp[0][1]=dp[0][2]=0;    int i;     rfor(i,1,20)    {        dp[i][0]=dp[i-1][0]*9-dp[i-1][1];        dp[i][1]=dp[i-1][0];        dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];    }}int A[25];int solve(int x){    int len=0,ans=0,i;    while(x)    {        A[++len]=x%10;        x/=10;    }    A[len+1]=0;    bool flag=false;    lfor(i,len,1)    {        ans+=dp[i-1][2]*A[i];        if(flag) ans+=dp[i-1][0]*A[i];        else        {            if(A[i]>4) ans+=dp[i-1][0];            if(A[i]>6) ans+=dp[i-1][1];            if(A[i+1]==6&&A[i]>2) ans+=dp[i][1];        }        if(A[i]==4||A[i]==2&&A[i+1]==6) flag=true;    }    if(flag) ans++;    return ans;}int main(){    int l,r;    init();    while(~scanf("%d%d",&l,&r))    {        if(!l&&!r) break;        l--;        int ans=r-l;        l=solve(l);        r=solve(r);        ans-=r-l;        printf("%d\n",ans);    }    return 0;} 
0 0
原创粉丝点击