半停課狀態的這幾天,我猛肝了一波動態規劃,突然有了以下一些思路和感想。
1.大多題目都可以使用動態規劃來做,只是時間和空間是否允許的問題。
1.1使用f陣列描述狀態,如果描述不清,加一維;還描述不清,再加一維。直到演算法的時間或空間gg為止。n個[ ]可能大多數情況無法實現,但是我認為客觀存在這種演算法。
1.2當[ ]與[ ]之間存在直接聯絡(比如橫縱座標的某些關係)或與其他[ ]有間接聯絡時,可以優化刪掉乙個[ ]。
2.乙個f應該有3個[ ],分別是f[階段] [狀態] [決策],有時省略某個或增加某個。
2.1[階段]:如樹形dp的根、揹包的已瀏覽物品...
2.2[狀態] :棋盤格仔座標的最優解...
2.3[決策] :是否收入揹包、max(...,...)...
3.dp和記憶化搜尋在高難度題目時需要結合,尤其是樹上問題,兩者並不分家。
3.1為了方便甚至可以引入鏈式前向星,並查集,topo等實現遞推。
3.2dp的for是路徑,f是答案收集。記憶化搜尋提供的是一種遍歷方式,比較然後記錄最優解。某些情況,for已經不能實現遍歷或者有極高複雜度,需要dfs和3.1中的幫助。
4.所有dp都可以是線性dp,只是你怎麼看問題本質。
5.時間複雜度越高的演算法越全能
關於動態規劃的一點學習感想
關 於 動態規劃 1 完整思路或大體思路比具體編碼要更加重要,所以一定要搞清楚整個問題的思考過程 2 動態規劃的特點 狀態,能夠代表當前的情況,比如0 1揹包中的 選 或者 不選 第 i 個物品。而且 一定 要 注意,當前狀態 只 和 前乙個狀態 有關,或者說 只有 前乙個狀態 直接影響 當前 狀態...
個人最近做的動態規劃大型總結!!!
題目思想大概是這樣 cabbeaf 回文子串行有 c,a,aa,bb,aba,abba,e,f,最長的就是abba,所以輸出長度為4 include include includeusing namespace std const int n 2000 int dp n n int main 顛倒字...
DP(動態規劃)個人學習 初步
動態規劃是一種重要演算法,其思想,在我個人理解來看,就是把問題逐步地進行簡化,從乙個看似複雜的問題,將問題化小,簡化到可以用某條公式 狀態轉移方程 逐步求出每種狀態的解,直到最後求出所要的答案。比如01揹包問題,揹包容量有限,要盡可能裝入價值大的物品,我們可以假設乙個dp陣列,其中dp j 表示在容...