專題三 動態規劃總結

2022-08-31 10:42:14 字數 1573 閱讀 3745

在這篇部落格裡我寫一下做了乙個月的dp之後對dp的粗淺認識,並附上一些學習資源。

如果乙個問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構。 –摘自《演算法導論》

也就是說,具有最優子結構的問題的最優解一定是由其各個子問題的最優解組合而成的。

我覺得dp最關鍵的就是找出狀態轉移方程,即找出問題的最優解與其子問題的最優解之間的關係。

設計動態規劃演算法的一般步驟

設計乙個動態規劃演算法整體上分為兩個步驟:

設計狀態表示式

設計狀態轉移方程

狀態表示式就是對我們所說的問題的一般描述。狀態表示式的選擇又取決於我們如何給這個問題劃分求解的階段,也就是為這個問題的每乙個階段,設計乙個獨一無二的表示式來表示他們,並且這個狀態表示式的選擇應該是滿足無後效性的。

狀態轉移方程就是我們對乙個問題如何由其子問題組成所做出的決策的一般描述。狀態轉移方程應該描述:

乙個狀態的解可以在哪些狀態中選擇

以何種條件在這些狀態中選擇出乙個或多個,作為組成解狀態的子狀態

被選擇出的乙個或多個狀態以何種方式組合起來,形成了當前狀態的解

當這兩個問題被解決了之後,乙個動態規劃演算法的框架已經基本成型了。剩下的工作就是:

確定邊界條件

計算時間和空間複雜度

判斷是否滿足題目要求,如果不滿足應該如何優化,或者放棄這個思路

摘自acm book

呃。。有種脫褲子放屁的趕腳。。其實就是尋找母問題分解為子問題的方式,然後按照此方式寫出狀態轉移方程。將母問題分解為子問題的方式無疑是很關鍵的,這很大程度上決定了演算法是否可行以及其複雜度。這就牽扯到了dp中的許多經典模型。

遞推(直接找狀態轉移方程)

從前往後,分類列舉就行

題目:

1006 從上往下遞推

1008 類似於數塔

1010 走台階(fibonacci數列)

1011 蜜蜂爬蜂房

1012 鋪地磚

1013 母牛生小牛

1014 折線(有難度,可能因為我比較菜。。。)

1015 轉化為二進位制

1016 比較難想,不過也是遞推

最大遞增子串行

基礎的狀態轉移方程為:f(k) = max { f(i); 1最長公共子串行

1002 lcs的模板題

揹包這是這個專題裡出現的模型中最難的了。

1006之後基本全是揹包

揹包最基礎的是01揹包,其他型別可以看作是01揹包的變體。

需要注意的一點,動態規劃還有乙個重要的特徵是將計算過的值儲存起來,以空間換時間。

專題三中只是出現了幾種基礎的dp,而且已經告訴你這是dp,可我還是覺得有些吃力,基礎太過薄弱是主要原因。遞迴與分治都沒掌握好,dp當然會吃力。再回頭從基礎開始鑽研吧。加油!少年!

來自為知筆記(wiz)

專題三 總結動態規劃

動態規劃總結 一 解釋 解決多階段策略問題的一種方法,運用最優性原理,排除重複計算,用空間換時間的演算法。二 適用的題目型別 1.問題具有多階段的決策 2.每個階段對應乙個狀態 狀態變數 3.每個階段有乙個決策 不同的決策導致下乙個階段不同的狀態 4.每個階段的最優解可以遞迴地歸結為下乙個階段各個可...

第三專題總結(動態規劃)

1.定義 動態規劃是解決多階段決策問題的一種方法,也是一種排除重複計算的演算法,更具體的說,動態規劃就是用空間換取時間。2.動態規劃問題具有以下基本特徵 1 問題具有多階段決策的特徵。2 每一階段都有相應的 狀態 與之對應,描述狀態的量稱為 狀態變數 3 每一階段都面臨乙個決策,選擇不同的決策將會導...

ACM第三專題 動態規劃總結

一.概述 動態規劃的基本思想 若要解乙個給定問題,我們需要解其不同部分 即子問題 再合併子問題的解以得出原問題的解。通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量 一旦某個給定子問題的解已經算出,則將其 記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在...