- 我们用一个数组a存储所给区间边界的各个位数的值,例如246,在a中的存储为:6 4 2,位数越高在数组中的排序越后,再用一个二维数组dp[pos][pre]存储当上一位(pos+1位)数字是pre时第pos位满足条件约束条件的数字个数,不满足条件的数字会continue跳过,不会进入递归。
- 然后还有一个参数limit用来判断当前的限制情况,继续例如246,当pos=2(十分位)时,若pre=2(百分位的值是2),则limit=1,表示有所限制,在判断上界时,当前位的上限只能到4,因为再往上走就超过了246这个范围;而当pos=2时,若pre<2(百分位的值小于2,比如1),则limit=0,表示没有限制,上界就为9,因为190+肯定在246的范围之内。
- 所以当下一次递归的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,判断时不受限制。至于前导零等其他的参数根据具体题目而定。
【数位DP】个人学习总结
最新推荐文章于 2023-07-21 13:53:35 发布
