hdu2089

maksyuki 发表于 oj 分类,标签:
0

不要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

Author

qianneng

Source

迎接新学期——超级Easy版热身赛

 

题目类型:数位DP

算法分析:dp[i][0]表示长度为i不含不吉利数字的个数,dp[i][1]表示长度为i不含不吉利数字且高位为2的个数,dp[i][2]表示长度为i含有不吉利数字的个数。状态转移方程为dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1]; dp[i][1] = dp[i-1][2]; dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1] + dp[i-1][0],初始条件为dp[0][0] = 1,最后对于每个读入的数字从高位开始计算:先加上当前位乘上低位含有不吉利数字的个数。然后判断此时不吉利数字是否曾经出现过,若出现过,则累加当前位乘上低位不含有不吉利数字的个数。若此时没有出现过,且最高位的值大于6,则还要加上低位不含有不吉利数字且最高位为2的数字个数,且最高位的值大于4的话,则还要加上低位不含有不吉利数字的个数。最后再判断当前位和高一位的值是否能够组成62或者是4,若可以,则把标志置为true,注意此时还应该判断是否会出现高位为6,而低位比2大的情况,若出现,则还要加上dp[i][1]!!!注意上面求解的是(0, n)范围内满足条件的个数!!!

 

算法分析:另一种方法就是dp[i][j]表示开头为j的i位数不是不吉利数的个数,则状态转移方程为dp[i][j] += dp[i-1][k],其中满足j != 4 && !(j == 6 && k == 2)。最后对于每个输入的n从高位开始计算:若满足不是吉利数的条件,则累加答案。若中间遇到一个不满足条件的数的话,直接break即可