数位dp---思路构思

用于数位dp 的模式回顾。。。。。


看了几个博客没有自己满意的最终都是看代码。。。

对数位dp的理解:

就是个计数器
数位:指的是以一个数的某一位当主要状态的意思
dp:就是记录状态
而数位dp则就是利用数位的来当记录的状态,然后累加计数;实则为记忆化搜索

如何实现:

首先你要找到状态的联系,简单的说,例如:数位相加能被10整除的数的个数,它们的联系就是单纯的数位相加取余10等于0,这里你必须要想到在还没到达边界时,如何让查百位数是可以利用到十位数的状态,这里就可以想到如果百位数是1的时候十位为i,dp[十位的位置][(1+i)%10]的状态就如i = 1时是查11十的数,实则与查的是i+1就相当于查十位为2的时候有几种出现的可能是一样的因为1+1的2嘛,这个其实就可以在百位为0时查20的时候就吧它状态记录了以后的都不用记录了。。。
现在想到了这个联系就应该开始构建代码了
那该如何构建呢?

此时想好了状态联系,先去数位在一个数组, 从最高位往回递归,用最高你记录的每一个数当边界从上到下就如123百位为1是个边界,记录是否为边界状态,如果是那之后2也是等等,不是就可以从0到9查了,然后就是递归记值在不是限制的情况下大家都一样所以可以在返回时就记录dp【位置】【你的上下联系】状态,相加计算总和就行例如刚才的百位为1时它就等于十位加1一样的状态所以它可以找dfs(位置 - 1, 状态(百位+遍历用的十位)取余10, 上个是否是限制 && 如果是遍历的十位是否遍历到限制了);


完结希望以后不会了看到这个能会。。。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值