杭电hdu 2089 数位dp

杭州人称那些傻乎乎粘嗒嗒的人为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 <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <string>
11 using namespace std;
12 typedef long long LL;
13 int dp[15][15], n, m, num[10];
14 void init() {
15     dp[0][0] = 1;
16     for (int i = 1 ; i <= 7 ; i++) {
17         for (int j = 0 ; j < 10 ; j++) {
18             for (int k = 0 ; k < 10 ; k++) {
19                 if (j == 4 || (j == 6 && k == 2)) continue;
20                 dp[i][j] += dp[i - 1][k];
21             }
22         }
23     }
24 }
25 int getlen(int x) {
26     int ret = 0;
27     while(x) ret++, x /= 10;
28     return ret;
29 }
30 void getnum(int x, int len) {
31     memset(num, 0, sizeof(num));
32     for (int i = 1 ; i <= len ; i++) {
33         num[i] = x % 10;
34         x /= 10;
35     }
36 }
37 int getans(int x) {
38     int ans = 0, len = getlen(x);
39     getnum(x,len);
40     for (int i = len ; i >= 1 ; i--) {
41         for (int j = 0 ; j < num[i] ; j++) {
42             if (j == 4 || (j == 2 && num[i + 1] == 6) ) continue;
43             ans += dp[i][j];
44         }
45         if (num[i] == 4 || (num[i] == 2 && num[i + 1] == 6)) break;
46     }
47     return ans;
48 }
49 int main() {
50     init();
51     while(scanf("%d%d", &n, &m) != EOF) {
52         if (n == 0 && m == 0) break;
53         printf("%d\n", getans(m + 1) - getans(n));
54     }
55     return 0;
56 }

猜你喜欢

转载自www.cnblogs.com/qldabiaoge/p/9345739.html