题目链接
题目类型:数位DP
题目分析
题目大意
给出一个数字n
,问1~n
区间内,数字不含有49
的数字的个数
解析
数位DP的入门题目了,网上搜了个模版,理解了半天,太弱了。
先分析一下这题用数位DP怎么应用。对于最暴力的情况,我们要找1~n
这n
个数字,然后一位一位的暴力,看这个数字中是否存在46
,如果是,则计数器也就是结果自增1。但是用数位DP有什么好处呢?虽然我们还是得把很多数都跑一遍,但是我们在跑当前这个数的时候就知道这个数中是否存在46
,这样就省去了我们暴力枚举每一位的麻烦,此外,如果我们要找58967
内的数字个数,当我们枚举长度为pos以pre为最高位的个数时,我们只需要枚举一次即可,一个记忆化搜索的过程可以减少指数级别的复杂度。
然后说一下这个题。我们需要4个变量去存储,pos表示当前位,位数从1开始,pre表示前一位数字,那么dp[pos][pre][status]
表示的就是对于前一位为pre最高位下标为pos状态为status的情况,比如dp[6][2][1]
即表示第七位为2,再加上后面六位,含有目标情况(本题中的49)的个数。需要注意的一点是,当前位也就是第6位,必须是从0~9
的情况,如果limit
变量为true
,会对上界有所限制,我们就不能直接取,此时存起来自然也是没有意义的
DFS去遍历即可
代码
1 |
|