HDU-2089-不要62(数位DP)

来源:互联网 发布:TS是什么画图软件 编辑:程序博客网 时间:2024/06/10 20:48

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

题意:求[L,R]间数字中不含4和62的个数

题解:数位DP

CODE:


#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3fint dp[10][5];///dp[i][j]:int a[20];int solve(int x){    int len=0,ans=0,flag=0;    int p=x;    while(x){a[++len]=x%10;x/=10;}    for(int i=len; i>0; --i)    {        ans+=dp[i-1][2]*a[i];        if(flag){ans+=dp[i-1][0]*a[i];continue;}        if(a[i]>4)ans+=dp[i-1][0];        if(i<len&&a[i]>2&&a[i+1]==6)ans+=dp[i-1][0];        if(a[i]>6)ans+=dp[i-1][1];        if(a[i]==4||(i<len&&a[i]==2&&a[i+1]==6)){flag=1;}    }    return p-ans-flag;}//dp[i][0] :  长i合法//dp[i][1] : 最高2长2合法//dp[i][2] :  长i非法int main(){    int a,b;    dp[0][0]=1;    for(int i=1; i<=7; ++i)    {        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];    }    while(scanf("%d%d",&a,&b)!=EOF)    {        if(a==b&&b==0)break;        printf("%d\n",solve(b)-solve(a-1));    }    return 0;}/*1 1000 0*/





0 0
原创粉丝点击