2089 不要62 数位dp-1

Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
 
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
 
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
 
Sample Input
1 100 0 0
 
Sample Output
80
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<stack>
 8 #include<queue>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 int f[10][10];
13 int cal(int n)
14 {
15     int len=0,num[10],sum=0,i,j;
16     num[0]=0;
17     while(n)//分离出位数和该位数上的数
18     {
19         num[len]=n%10;
20         len++;
21         n=n/10;
22     }
23     num[len]=0;
24     for(i=len-1;i>=0;i--)
25     {
26         for(j=0;j<num[i];j++)
27         {
28             if(j!=4&&!(j==2&&num[i+1]==6))//注意是两个(&&)而不是(||)和(&&)
29                sum=sum+f[i+1][j];//不同位上不同数字进行求和
30         }
31         if(num[i]==4||(num[i+1]==6&&num[i]==2))//如果其中一个位数上的为4或者62的话这个车牌就不能用,所以跳出了
32         break;
33     }
34     return sum;
35 }
36 int main()
37 {
38     int n,m,i,j,k;
39     memset(f,0,sizeof(f));
40     f[0][0]=1;
41     for(i=1;i<=7;i++)//打表,初始化第i位上数字j其余位上都是0有多少个车牌数
42     {
43         for(j=0;j<=9;j++)
44         {
45             for(k=0;k<=9;k++)
46             {
47                 if(j!=4&&!(j==6&&k==2))
48                   f[i][j]+=f[i-1][k];
49             }
50         }
51     }
52     while(cin>>n>>m&&(n||m))
53     {
54         cout<<cal(m+1)-cal(n)<<endl;
55     }
56     return 0;
57 }
View Code

第一次接触数位dp,代码虽然不是自己想出来的,但也明白了是怎么回事

原文地址:https://www.cnblogs.com/wang-ya-wei/p/5398671.html