数位 dp

数位dp含义:

数位:一个数有个位,十位,百位,千位等等,数的每一位都是数位。

数位dp归为计数dp,是在数位上进行操作的dp。

数位dp的实质是一种快速枚举的方式,它满足dp的性质,然后进行记忆化搜索。

用途:

有两个数,两个数范围很大(例如1e9,甚至更大),求这两个数符合限定条件的个数。纯暴力不行,就要用数位dp。

例子:求从0到n,(n为2^32-1),(条件)求包含49的数有多少; 

思路or具体实现:

n为2^32-1,数位其实只有20位,枚举数位,就不会超时。

dp[shuwei][diaojian]。dp的第一维通常是数位,后面的几维根据题目条件来设定。上面给的例子只用了一维。

控制上界枚举,从最高位往下枚举。用记忆化搜索来做,抛开循环后转移状态能更加随意,大部分数位和动态规化的题都可随意切换。搜索与循环异曲同工之妙,但前者更易转移状态,在限制较多的情况下被大部分人喜爱。

例题:Bomb

思路 :数位dp=dfs+记忆化搜索。

需要注意上限即题目所给范围的预处理,本题用digtis[20] 数组,存储上限的数位,最好用一个函数来处理,比如solve(sum),处理时,对上限的数位总数拿一个变量进行存储,比如k或len。

在dfs中用 limit (有些题解是top)判定上限,dfs(len,条件,limit);

dfs执行数位dp,在搜索时用了 up_bound=(limit?digit[len]:9); 来标记上限,同时用cnt来存储满足的条件的数量,然后更新dp数组,更新时要满足if(!limit),到达上界,状态不完整。

在dfs中对条件的处理,需要根据题意去确定,每个题目不一样。

是否顶着上界,每层确定这一位选啥,判断是否和上一位冲突,全部确定完了方案数+1。

由于顶着上界是比较特殊的情况,所以这类答案直接一层层搜索出答案,不用记忆化,其他(不顶着上界)的情况用dp[][] 直接返回数量。

有些题目需要最后算一下最高位为0的情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值