數字DP 入門學習詳解

2021-08-25 02:27:55 字數 1446 閱讀 9906

數字dp是dp的一種,顧名思義,按每乙個數字來進行dp。

題目的要求與乙個數字相關,並且它能通過每乙個數字來進行轉移。

例題:求所有n

nn位數中能被m

mm整除的數的個數。

一般的dp是多維的,首先會有一維表示的是當前到了第幾位,通常情況這一維可以使用滾動。

其它的就是根據題目的實際要求了,如例題就需要一維來記錄除以m

mm的餘數。

以例題為例,我們來講講數字dp怎麼實現。

我們設f[i

][j]

f[i][j]

f[i][j

]表示當前到了第i

ii位,除以m

mm的餘數為j

jj的方案數。

一般是從高位往低位dp,因為最高位不能為0

00,所以我們對i=1

i=1i=

1的情況先處理好:

f [1

][im

odm]

=1(1

≤i≤9

)f[1][i\mod m]=1(1≤i≤9)

f[1][i

modm

]=1(

1≤i≤

9)接著我們用第i

ii位的狀態去更新第i+1

i+1i+

1位的狀態,每次列舉當前在第i+1

i+1i+

1位加入kkk。

想想怎麼轉移?

對於當前的餘數j

jj,在末尾加入了k

kk,餘數變成什麼?

根據同餘的性質,我們自然可以得到:餘數變成了(j∗

10+k)

modm

(j*10+k)\mod m

(j∗10+

k)mo

dm。所以,狀態轉移方程如下:

f [i

+1][

(j∗10

+k)m

odm]

+=f[

i][j

](1≤

i

0≤

j

0≤k≤

9)

f[i+1][(j*10+k)\mod m]+=f[i][j](1≤if[

i+1]

[(j∗

10+k

)mod

m]+=

f[i]

[j](

1≤i0≤

j0≤k≤

9)最後的答案是什麼?

首先,第一維自然是n

nn,那麼第二維取什麼值呢?

顯而易見,要求是m

mm的倍數,所以第二維是000。

綜上所述,最後的答案是f[n

][0]

f[n][0]

f[n][0

]。【數字dp】jzoj 5831. 【noip提高a組模擬2018.8.18】 number

數字DP入門 數字DP模板

數字dp是一種計數用的dp,一般就是要統計乙個區間 le,ri 內滿足一些條件數的個數。所謂數字dp,字面意思就是在數字上進行dp咯。數字還算是比較好聽的名字,數字的含義 乙個數有個位 十位 百位 千位.數的每一位就是數字啦!之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的...

數字DP入門詳解 題目推薦

update 2019 9 6 部落格裡某些東西沒有解釋清楚,完善了對應的解釋 在開始之前,我們先來看一道題 題目鏈結 題目要求,相鄰兩位的差大於等於2,那麼我們先來構造乙個試一試。比如說 15246 這個數,我們先取第一位為 1 然後第二位是 5 5 1 4 2 所以符合條件,第三位是 2 5 2...

數字DP入門

數字dp顧名思義就是對數字運用dp思想,將每位數看成下一位的子狀態,即個位看成十位的子狀態,十位看成百位的子狀態。下面給出狀態方程 dp i j dp i 1 k k 0,1,2,3.9 dp i j 表示i位數,首位是j的數字有多少符合要求的,我們從低位逐步遞推求到高位。下面拿一道入門題來具體說明...