【数位DP】个人学习总结

本文介绍了一种用于计算特定区间内符合条件的数字个数的算法。通过使用数组存储边界值,并采用动态规划方法,记录在给定条件下各位置可能的数字组合数量。特别讨论了如何根据当前位数和上一位的值来确定限制条件。
  1. 我们用一个数组a存储所给区间边界的各个位数的值,例如246,在a中的存储为:6 4 2,位数越高在数组中的排序越后,再用一个二维数组dp[pos][pre]存储当上一位(pos+1位)数字是pre时第pos位满足条件约束条件的数字个数,不满足条件的数字会continue跳过,不会进入递归。
  2. 然后还有一个参数limit用来判断当前的限制情况,继续例如246,当pos=2(十分位)时,若pre=2(百分位的值是2),则limit=1,表示有所限制,在判断上界时,当前位的上限只能到4,因为再往上走就超过了246这个范围;而当pos=2时,若pre<2(百分位的值小于2,比如1),则limit=0,表示没有限制,上界就为9,因为190+肯定在246的范围之内。
  3. 所以当下一次递归的limit的值只有在当前limit=1(有所限制)并且作为下轮递归的pre=当前位数的值a[pos]时等于1,比如246,在我们进入个位数递归时,如果当前limit=1,表示在判断十位数时有所限制(百分位的数字是2),并且此时作为下轮递归的pre的值=4,那么个位数递归的limit就要等于1,个位数取值的上界就只能到6。而14X(pre=a[pos]但原limit=0)、23X(原limit=1但pre!=a[pos])的limit都=0,判断时不受限制。至于前导零等其他的参数根据具体题目而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值