1. 程式人生 > >【數位DP】入門學習詳解

【數位DP】入門學習詳解

數位DP

什麼是數位DP

數位DP是DP的一種,顧名思義,按每一個數位來進行DP。

什麼時候使用

題目的要求與一個數字相關,並且它能通過每一個數位來進行轉移。
例題:求所有n位數中能被m整除的數的個數。

怎麼使用

一般的DP是多維的,首先會有一維表示的是當前到了第幾位,通常情況這一維可以使用滾動。
其它的就是根據題目的實際要求了,如例題就需要一維來記錄除以m的餘數。
以例題為例,我們來講講數位DP怎麼實現。

狀態與轉移

我們設f[i][j]表示當前到了第i位,除以m的餘數為j的方案數。
一般是從高位往低位DP,因為最高位不能為0,所以我們對

i=1的情況先處理好:

f[1][imodm]=1(1i9)

接著我們用第i位的狀態去更新第i+1位的狀態,每次列舉當前在第i+1位加入k
想想怎麼轉移?
對於當前的餘數j,在末尾加入了k,餘數變成什麼?
根據同餘的性質,我們自然可以得到:餘數變成了(j10+k)modm
所以,狀態轉移方程如下:

f[i+1][(j10+k)modm]+=f[i][j](1i<n0j<
m0k9)

最後的答案是什麼?
首先,第一維自然是n,那麼第二維取什麼值呢?
顯而易見,要求是m的倍數,所以第二維是0
綜上所述,最後的答案是f[n][0]

更多拓展