數字dp是動態規劃裡面一種很特殊的形式,因為我對於其他動態規劃問題習慣使用迭代的形式,但是對於數字dp更喜歡使用遞迴的形式,所以對於這種dp單拎出來寫一下。
其實dp是一種比較玄妙的思想,很難用一種套路的方式表達出來,關鍵是那種對於給定問題如何去定義「狀態」的那種感覺。數字dp其實也是如此,只不過它的狀態一般不是那麼直接,而是需要一步轉化。因為通常的dp都是定義好狀態,最後dp[***]就是結果,但是數字dp是借助dp的狀態陣列來得到最終的結果。
通常來說問題是這樣的:給定乙個條件,問[l, r]之間滿足條件的整數有多少個。
最暴力的方式當然是這樣:
for (int i = l; i <= r; i ++ )
數字dp的方法當然不會這麼暴力,它通常會定義乙個狀態陣列dp[pos][state]表示到第pos位開始可以隨便放數字了,並且此時前面的狀態是state(state這裡可以是多維),滿足條件的數字有多少個。
這個dp陣列可以迭代得到,但是我覺得記憶化搜尋的形式更好理解一些,所以這個dp陣列通常是dfs得到,這個dfs函式的引數除了pos和state以外,還會設定乙個全域性變數陣列b,表示要解決的問題的右邊界。此外,還要加乙個preok,表示是否可以開始隨便放數字的狀態。如果前面的已經比右邊界小了,後面就可以隨便放了,記錄dp陣列的時候只記錄這些可以隨意放的即可,因為不隨意放的那些可以通過dfs得到。
下面是我的訓練題目彙總
MVP基本思想
mvp的邏輯性思維都在p層,他降低了頁面的耦合度,具備低耦合的特性,mvp的出現使 更具邏輯性 首先我們看到分包的嚴謹性 mvp的結構分析 p層負責整體邏輯並且將m層和v層聯絡起來,m層主要負責 塊,callback將結果集返回p層,v層最後展示檢視 注意以下介面 public inte ce my...
git基本思想
git相比叫傳統的基於檔案svn優勢明顯,主要體現在天然分布式不怕丟失 不以檔案為為基礎,基於git的資料庫 commit雜湊健值檔案 的版本管理,分支 標籤等操作飛速,而不是緩慢地檔案和目錄操作 git下每個人都有乙個獨特的工作區和分支,不必實時和中心伺服器同步就可以 帶有社交性質的基於fork ...
動態規劃入門(一) DP 基本思想
動態規劃 dp 是一種重要的演算法設計思想,是演算法設計的一柄利器。但是,要掌握dp並且運用自如,絕對不是什麼容易的事。dp的基本思想 1.把乙個大問題的解轉化為若干個小問題的解。2.如果得到了這些小問題的解,然後再經過一定的處理,就可以得到原問題的解。3.這些小問題與原問題有著結構相同,即小問題還...