#sWDPybttg050305. 1589:不要 62
1589:不要 62
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:HDU 2089
杭州人称那些傻乎乎粘嗒嗒的人为 (音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有 或 的号码。例如:、、 都属于不吉利号码。但是, 虽然含有 和 ,但不是 连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号 ,推断出交管局今后又要实际上给多少辆新的士车上牌照了(即区间内不含 和 的数字个数)。
输入格式
输入包含多组数据。每组数据一行两个整数 ,如果遇到 且 则输入结束。
输出格式
对于每组数据,输出一个整数,表示 中不含 和 的数字个数。
样例
样例输入
1 100
0 0
样例输出
80
样例解释
在 中,不吉利的数字有:
- 含 的数:,共 个?
- 含 的数:,共 个。
注意 含有 已计入, 单独。
经过统计,不吉利的数字共 (含 )() 个。
所以吉利的数字个数为 。
数据范围
对于全部数据:
- 输入以 结束
时空限制
- 时间:
- 内存:
提示
此题为 数位 DP 经典题。
状态设计: 表示处理到第 位,上一位数字是 ( 为 ,若前面全是前导零则 为 或特殊值,但这里前导零不影响限制,所以 初值可取 )时,满足条件的方案数。
转移条件:
- 当前位不能为 ;
- 如果上一位 ,则当前位不能为 。
记忆化:, 表示上一位数字。
DFS 参数:
- pos:当前位;
- last:上一位数字;
- limit:是否受上限限制;
- lead:是否前面全是前导零(可省略,因为 last=0 时表示前面全 0)。
当 pos 到达末尾时,返回 1。
转移时枚举当前位数字 从 到 (limit ? digit[pos] : 9):
- 如果 ,跳过;
- 如果 且 ,跳过;
- 否则继续 DFS(pos+1, d, limit && d==digit[pos])。
初始化 last=0,且当 last=0 且 d=0 时,表示继续前导零,last 仍为 0。
最终答案为:calc(m) - calc(n-1)。
复杂度:状态数 ,可以快速计算。
注意:数字 是否算吉利? 不含 和 ,但车牌号一般没有前导零,且区间从正数开始,所以不影响。若 ,需要单独考虑 是否计入。