今天是集訓的第一階段的結束。
第一階段 是以dp入門為主。因為智力真的有限,學長介紹了那麼多的dp實在有點接受不了,所有這幾天一直在搞數字dp。
先談一些我的理解,在我看來,數字dp就是一種優雅的暴力。
數字dp是一類計數問題。
具體題目大體以,統計乙個區間【l,r】內,滿足條件的數有多少個。
數字dp特徵:一般l,r都會取1e9~1e18之間的數。
因為只是入門,所以大體介紹一下。
在我看來,數字dp有三種解決方法。
一.dfs記憶化搜尋
這應該是最常見的解決方法了,對狀態進行搜尋。dfs搜尋進行排除不合意的條件。
通常都會有模板。(偷自一位dalao的部落格)
int dfs(int i, int s, bool e)
其中:f為記憶化陣列;
i為當前處理串的第i位(權重表示法,也即後面剩下i+1位待填數);
s為之前數字的狀態(如果要求後面的數滿足什麼狀態,也可以再記乙個目標狀態t之類,for的時候列舉下t);
e表示之前的數是否是上界的字首(即後面的數能否任意填)。
for迴圈列舉數字時,要注意是否能列舉0,以及0對於狀態的影響,有的題目前導0和中間的0是等價的,但有的不是,對於後者可以在dfs時再加乙個狀態變數z,表示前面是否全部是前導0,也可以看是否是首位,然後外面統計時候列舉一下位數。it depends.
二.預處理區間
先對所有的特徵片段區間進行篩查,排除不可能或者可能的情況,用陣列儲存
然後將n進行分解,利用for迴圈進行判斷,得出正確結論
三.強行dp陣列暴力
來自我學長的**的啟示,利用幾層for迴圈進行暴力。。(只是對比前兩種方法得出的結論)
可能這麼說有點吃力也不好懂。。畢竟是乙隻萌萌的菜雞。結合具體題目來寫吧
數字DP入門 數字DP模板
數字dp是一種計數用的dp,一般就是要統計乙個區間 le,ri 內滿足一些條件數的個數。所謂數字dp,字面意思就是在數字上進行dp咯。數字還算是比較好聽的名字,數字的含義 乙個數有個位 十位 百位 千位.數的每一位就是數字啦!之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的...
數字DP入門
數字dp顧名思義就是對數字運用dp思想,將每位數看成下一位的子狀態,即個位看成十位的子狀態,十位看成百位的子狀態。下面給出狀態方程 dp i j dp i 1 k k 0,1,2,3.9 dp i j 表示i位數,首位是j的數字有多少符合要求的,我們從低位逐步遞推求到高位。下面拿一道入門題來具體說明...
數字dp入門
數字dp,顧名思義 對數的位數進行操作。一般 題目會與數的位數相關。數字dp最重要的是其dp陣列的確定,根據需要 可以確定多維dp陣列,一般dp陣列的每一對下標 都只能唯一確定乙個狀態,或者 對結果並不影響。dp陣列一定會有一維表示 當前列舉到的 位數。模版 如 此處設立的dp陣列為二維 int d...