HDU 2089 不要62 (数位DP)

不要62
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Appoint description: 

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 <string>
 4 #include <queue>
 5 #include <vector>
 6 #include <map>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cctype>
10 #include <cstdlib>
11 #include <cmath>
12 #include <ctime>
13 #include <climits>
14 using    namespace    std;
15 
16 long    long    DP[20][20];
17 
18 void    ini(void);
19 long    long    solve(int n);
20 int    main(void)
21 {
22     int    n,m;
23 
24     ini();
25     while(cin >> n >> m && n + m)
26         cout << solve(m + 1) - solve(n) << endl;
27 
28     return    0;
29 }
30 
31 void    ini(void)
32 {
33     DP[0][0] = 1;
34     for(int i = 1;i <= 7;i ++)
35         for(int j = 0;j <= 9;j ++)
36             for(int k = 0;k <= 9;k ++)
37                 if(j != 4 && !(j == 6 && k == 2))
38                     DP[i][j] += DP[i - 1][k];
39 }
40 
41 long    long    solve(int n)
42 {
43     int    dig[20] = {0};
44     int    count = 1;
45 
46     while(n)
47     {
48         dig[count] = n % 10;
49         n /= 10;
50         count ++;
51     }
52 
53     long    long    ans = 0;
54     for(int i = count - 1;i >= 1;i --)
55     {
56         for(int j = 0;j < dig[i];j ++)
57             if(j != 4 && !(j == 2 && dig[i + 1] == 6))
58                 ans += DP[i][j];
59         if(dig[i] == 4 || (dig[i + 1] == 6 && dig[i] == 2))
60             break;
61     }
62 
63     return    ans;
64 }

 

posted @ 2015-09-11 21:35  Decouple  阅读(252)  评论(0编辑  收藏  举报