Link
https://jzoj.net/senior/#main/show/1115
Description
申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数字A1A2A3...Am-1Am(0<=Ai<=9)有m位,不出现是指X1X2X3...Xn-1Xn 中没有恰好一段等于A1A2A3...Am-1Am。A1和X1可以为0。
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果。
Solution
40分:动态规划
考虑到这道题匹配的顺序,可以采用动态规划。
设f[i,j]表示选到前i位,当前匹配到不吉利数字的位数j。
枚举当前位选的数(0~9),转移显然。
可是j的转移略微复杂。这里分三种情况
(1)当前位选的数使得j为0
例如不吉利数字为1101,当前匹配了3位,即101,若当前选0或2~9的数字,则j为0。
(2)当前选的数使得j为之前某一位的数
例如不吉利数字为11321,当前匹配了4位,即1321,若当前选2,那么我们不会将j赋值为0,为什么?
当出现21321的情况,开头两位可以与不吉利数字开头两位(21)匹配,故j应该为2
在如同1202,当前第4位选0,我们j应该位2
(3)按照不吉利数字的顺序发展
例如不吉利数字为1101,当前匹配了3位,即101,若当前选1,则j位4
我们可以用数组p[i,j]表示数字i放在当前已匹配了j位的不吉利数字上,上述所的j是多少。
显然有递推式(状态转移方程)
f[i+1,p[k,j]]+=f[i,j];(k位当前数字,j为原匹配了的位数,i为准考证位数匹配)
100分:矩阵乘法
显然可以用矩阵乘法来优化上面的递推式,用一个1*m和m*m的矩阵来弄