1 #include 2 #include 3 #include 4 #include 5view code6using
namespace
std;78
intt;
9long
long dp[19][19][2005
];10
long
long
l, r;
11int shu[20
];12
13long
long dfs(int len,..., bool
shangxian)
1426
if (!shangxian)
27 dp[len][...] =cnt;
28return
cnt;29}
3031
long
long solve(long
long
x)32
39return dfs(k,...,1)40
}4142int
main()
43
數字dp是一種計數用的dp,一般就是統計乙個區間[l,r]內滿足一些條件數 的個數,所謂數字dp,字面意思就是在數字上dp。數字的含義:乙個數有個位,十位,百位,千位···數的每一位就是數字。
之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的方式,使新的列舉方式滿足dp的性質,然後記憶化即可。
兩種不同的列舉:對於乙個求區間[l,r]滿足條件數的個數,最簡單的暴力如下:
for(int i=l;i<=r;i++)然而這樣列舉不方便記憶化,或者根本無狀態可言。if(right(i))
ans++;
數字dp模版
int dfs int i,int s,bool e f為記憶化陣列 i為當前處理串的第i位 權重表示法,也即後面剩下i 1位待填數 s為之前數字的狀態 如果要求後面的數滿足什麼狀態,也可以再記乙個目標狀態t之類,for的時候列舉下t e表示之前的數是否是上界的字首 即後面的數能否任意填 for迴圈...
數字dp的模版
typedef long long ll int a 20 ll dp 20 state 不同題目狀態不同 ll dfs int pos,state變數 bool lead 前導零 bool limit 數字上界變數 不是每個題都要判斷前導零 計算完,記錄狀態 if limit lead dp po...
模版 動態 dp
終於來寫這個東西了。lg 模版 給定 n 個點的數,點有點權,m 次修改點權,求修改完後這個樹的最大獨立集大小。我們先來考慮樸素的最大獨立集的 dp dp u 0 sum v max dp u 1 val u sum v dp v 0 現在我們就擁有了乙個 o nm 的做法,但是明顯它不優秀。既然支...