📜  数字DP |介绍(1)

📅  最后修改于: 2023-12-03 15:10:17.001000             🧑  作者: Mango

数字DP | 介绍

数字DP是指一种动态规划问题,在这种问题中,数字被认为是一种可计算的对象,可以被加、减、乘、除,与其他数字进行比较等。数字DP问题通常涉及到数字的性质和相关的运算性质,如数字的位数、数字的各位数字的和、数字的最大值和最小值等。

数字DP问题可以通过使用DP技术,利用记忆化搜索等算法解决。在解决数字DP问题时,首先需要确定问题中数位的表示方式。可以将数位表示为数列或二维数组或是字符串。

接下来,需要本次DP的状态,即状态的定义,通常状态的定义与当前数字的特征有关。例如,对于数字ABCDEF,状态可以表示为:f[i][j][k],其中i表示当前数位,j表示各位数位和的数值,k表示当前数字大于/等于/小于目标数字。

通过状态的定义,可以考虑状态的转移方程。如下所示:

f[i][j][1] = f[i-1][j-A[i]][1] * 10 + f[i-1][j-A[i]][0] + f[i-1][j-A[i]][2] (A[i]为当前数字的位值,1表示当前数字比目标数字小)
f[i][j][0] = f[i-1][j][0] * 10 + f[i-1][j][1] + f[i-1][j][2] (0表示当前数字等于目标数字)
f[i][j][2] = f[i-1][j+A[i]][2] * 10 + f[i-1][j+A[i]][1] + f[i-1][j+A[i]][0] (2表示当前数字比目标数字大)

以上方程为例,可以对当前状态进行计算。对于f[i][j][1],表示当前数字的位值(即A[i])小于目标数字,计算方法为当前数字的位值乘以10(表示当前位比后面一位大一个次幂)加上上一状态中各数位和为j-A[i]且为1的转移方程、上一状态中各数位和为j-A[i]且为0的转移方程、上一状态中各数位和为j-A[i]且为2的转移方程。

最后,需要记得设置边界条件(即数字的长度或特殊条件)和初始化状态(通常状态初始化都是1),以保证DP过程的正确性。


参考资料:

  1. 数字DP学习笔记
  2. 数字动态规划问题的思考
  3. 数字DP题目集