数位DP题集

Posted stolf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数位DP题集相关的知识,希望对你有一定的参考价值。

1.HDOJ2089
题意:求区间内不出现4和62的数的个数
解法:模板题

2.HDOJ3555
题意:求区间内不出现49的数的个数
解法:模板题

3.HDOJ5179
题意:对于一个十进制数,把每一位拆出来变成一个数组,要求数组右边的数都小于等于左边的数,且左数能整除右数。求区间内满足条件的个数
解法:dp[i=20][j=10]: j为前一位上的数
按要求转移即可,要考虑前导零,注意防止%0的情况出现

4.HDOJ3652
题意:求区间内含13或者是13倍数的数的个数
解法:dp[i=20][j=13][k=3]: j为对13的余数,k为状态(0: 前一位不是1 | 1: 前一位是1 | 2: 前面出现过13)
最后当j为0,k为2时加入计数,计算不含13并且不是13倍数的数
输出时为{N+1-solve(N)} (0也在统计内)

5.HDOJ3709
题意:定义平衡数,以某一数位作为原点,左边数位上{数字 × 距离}之和与右边数位上的相等。求区间内平衡数的个数
解法:dp[i=20][j=5000][k=20]: j为左边数位权值之和,k为枚举的原点
需要枚举原点,然后统计左边权值的减去右边的权值最后是否为零,由于 0 对于每个枚举位置都会被统计,最后要再减去{枚举次数 - 1}个重复的0

6.HDOJ6148
题意:对于一个十进制数,要求从左到右的数位没有出现先递增接着递减的情况,求区间内满足条件的个数
解法:dp[i=105][j=10][k=2]: j为前一个数,k表示前面是否已出现递增
按要求转移即可,要考虑前导零,这题的0是不合法的,额外减1就行了,注意数据范围10^100

7.HDOJ5898
题意:对于一个十进制数,要求数位中奇数段长度都为偶数,偶数段长度都为奇数,求区间内满足条件的个数
解法:dp[i=20][j=10][k=20]: j为前一个数,k为前一个数所属段的长度
要考虑前导零,转移时,当前数位若与前一位奇偶相反,表示前一段已结束,判断长度是否满足要求剪枝,并重置k为1继续向下枚举,最后统计时还要再判断一次j与k,奇偶相反则加入统计





















以上是关于数位DP题集的主要内容,如果未能解决你的问题,请参考以下文章

数位dp

数位dp模板 [dp][数位dp]

数位DP入门

数位dp详解

数位dp总结 之 从入门到模板

动态规划专题——数位DP