Loading

HDU 2089:不要62(数位DP)

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

 

不要62

 

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
 
数位dp适合在一段数的区间内找出满足某些条件的数的个数,这个时候往往不能之间遍历,肯定会超时,则一般使用数位dp来解决。
 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int dp[10][2];
 8 int bit[10];
 9 /*
10 数位DP入门
11 dp[pos][1]表示pos+1位为6的情况
12 dp[pos][0]表示正常
13 */
14 int dfs(int pos,bool st,bool flag)
15 {
16     if(!pos) return 1;
18     if(flag&&dp[pos][st]!=-1) return dp[pos][st];
19     int u=flag?9:bit[pos];
20     int ans=0;
21     for(int d=0;d<=u;d++){
22         if(d==4||st&&d==2) continue;
23         ans+=dfs(pos-1,d==6,flag||d<u);
24     }
25     if(flag) dp[pos][st]=ans;
26     return ans;
27 }
28 
29 int solve(int n)
30 {
31     int len=0;
32     while(n){
33         bit[++len]=n%10;
34         n/=10;
35     }
36     return dfs(len,0,0);
37 }
38 
39 int main()
40 {
41     int l,r;
42     memset(dp,-1,sizeof(dp));
43     while(cin>>l>>r){
44         if(l+r==0) break;
45         cout<<solve(r)-solve(l-1)<<endl;
46     }
47     return 0;
48 }

 

posted @ 2016-07-01 11:13  Shadowdsp  阅读(327)  评论(0编辑  收藏  举报