HDU 2089 不要62
不要62
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11823 Accepted Submission(s): 3686
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
相比于HDOJ 3555而言稍为复杂的数位DP,筛掉含有62或4的数字
[C]
1 #include<stdio.h> 2 #include<string.h> 3 4 int num[10]; 5 long dp[10][6]; //0表示什么都没有,1表示含有4,2表示首位含有6,3表示含有62,4表示既含有4又含有62,5表示已经有4且首位为6 6 long a,b; 7 8 long dfs(int pos,int flag,int limit) 9 { 10 int end,i,have; 11 long sum=0; 12 if(pos==-1) 13 return flag!=0&&flag!=2; 14 if((!limit)&&dp[pos][flag]!=-1) 15 return dp[pos][flag]; 16 end=limit?num[pos]:9; 17 for(i=0;i<=end;i++) 18 { 19 have=flag; 20 if(have==5&&i==2) 21 have=4; 22 if(have==5&&i!=2) 23 have=1; 24 if(have==3&&i==4) 25 have=4; 26 if(have==2&&i==2) 27 have=3; 28 if(have==2&&i==4) 29 have=1; 30 if(have==2&&i!=2&&i!=4) 31 have=0; 32 if(have==1&&i==6) 33 have=5; 34 if(have==0&&i==6) 35 have=2; 36 if(have==0&&i==4) 37 have=1; 38 sum+=dfs(pos-1,have,limit&&i==end); 39 } 40 if(!limit) 41 return dp[pos][flag]=sum; 42 return sum; 43 } 44 45 long Cal(long n) 46 { 47 int pos=0; 48 while(n) 49 { 50 num[pos++]=n%10; 51 n/=10; 52 } 53 return dfs(pos-1,0,1); 54 } 55 56 int main() 57 { 58 while(scanf("%ld%ld",&a,&b)==2) 59 { 60 if(a==0&&b==0) 61 return 0; 62 memset(dp,-1,sizeof(dp)); 63 printf("%ld\n",b-a+1-Cal(b)+Cal(a-1)); 64 } 65 }


浙公网安备 33010602011771号