數字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,一般就是要統計乙個區間 le,ri 內滿足一些條件數的個數。所謂數字dp,字面意思就是在數字上進行dp咯。數字還算是比較好聽的名字,數字的含義 乙個數有個位 十位 百位 千位.數的每一位就是數字啦!之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的... update 2019 9 6 部落格裡某些東西沒有解釋清楚,完善了對應的解釋 在開始之前,我們先來看一道題 題目鏈結 題目要求,相鄰兩位的差大於等於2,那麼我們先來構造乙個試一試。比如說 15246 這個數,我們先取第一位為 1 然後第二位是 5 5 1 4 2 所以符合條件,第三位是 2 5 2... 數字dp顧名思義就是對數字運用dp思想,將每位數看成下一位的子狀態,即個位看成十位的子狀態,十位看成百位的子狀態。下面給出狀態方程 dp i j dp i 1 k k 0,1,2,3.9 dp i j 表示i位數,首位是j的數字有多少符合要求的,我們從低位逐步遞推求到高位。下面拿一道入門題來具體說明...數字DP入門 數字DP模板
數字DP入門詳解 題目推薦
數字DP入門