《古老数字》题目分析
本题是一道比较简单的DP题目,只不过除了记录子问题的最优解,还需要记录子问题的决策以还原整个路径。
首先我们可以假设所有的?都是0,计算出这个数字模X的余数,设为r。
然后从低位到高位提取出来所有的?,假设一共有m个,其中第i个处于第p[i]位。
我们用bool f[i][j]
表示前i个(从低到高)问号是否有选法能使得N模X的余数为j。int a[i][j]
表示如果f[i][j] == true
,那么第i位最小的选择是0-9哪个数字。
边界条件是f[0][r] = true,递推方程是:
f[i][j] = Vf[i-1][j-d*10^p[i]] | d = 0/1 .. 9 (如果第i个问号是N的首位,则从1开始;否则从0开始)
a[i][j] = 最小的d满足 f[i-1][j-d*10^p[i]] == true
其中V表示多个布尔值的或和。
如果f[m][Y]==true即表示有解,这时依照a[][]数组的值倒推即可得出所有问号的取值。
自己蠢了。。。。。