對動態規劃(dp)的一點理解

2021-06-23 06:47:13 字數 1710 閱讀 2646

暑假實驗室搞集訓,實驗室安排我們幾個大二的(準大三)學長分別講點東西。我就被分到講dp;忽然發現,搞acm也有1年多了,好像都沒有好好的總結一下dp。就想說說我自己對dp的理解。

dp其實是一種思想,而不是一種演算法。它的核心就是一空間換時間。通過對所有狀態的最優解的記錄,再通過某種遞推關係,得到最終解。用查詢的方式代替重新計算,從而降低時間複雜度。說到時間複雜度,dp的時間複雜度有乙個統一的表示:狀態數*得到每個狀態最優解的時間。由於這些核心的思想,決定了dp的題目應該具備一些特徵:

1、最優子結構:最優子結構就是區域性最優能夠決定整體最優。即:我們要解決的乙個困難的大問題,能夠劃分成乙個個容易解決小問題,通過解決這些小問題,和這些小問題與大問題的某種遞推關係,得到大問題的解。

2、重疊子問題:這個是dp能過降低時間複雜度的原因。意思就是,在解決乙個大問題的過程中,需要多次解決某個小問題。由於我們已經把小問題的解計算出來,並存在記憶體中,所以在需要用到的時候直接取出來就行。不需要再去計算,這樣就能降低時間複雜度,空間換時間。

3、無後效性:我剛開始看到這個名次的時間是在《演算法藝術與資訊學競賽》這本書上。我看了好久都沒有明白,其實它的意思也很好理解。就是說當前要解決的子問題,只與前面比這個問題小的問題有關,對後來要解決的大問題沒有影響。並且大問題只關心的是小問題的最優解,至於最優解是怎麼來的,對大問題都沒有影響。

對於dp解題的一般思考方向,也主要是從dp的思想和問題的結構開始的。《演算法導論》上對此總結了dp的一般步驟:

1、描述最優解結構;

2、遞迴定義最優解;

3、按照自底向上的方式計算最優解的值;

4、按計算的結果構造乙個最優解;

感覺著個總結還是挺好懂的,我想談談我自己對解決問題中的一些想法和一些注意值得注意的地方;

1、狀態的確定,對於乙個dp題,首要的任務就是描述問題狀態,也就是最優子結構。狀態的確定其實並不簡單,自己感覺,正確的定義狀態(最有子結構),這個dp問題就解決了一半。但是狀態的確定還是有一定的思考方向的:模仿一些經典的dp問題中狀態的定義;仔細分析問題,觀察大問題能夠怎樣的分解,這種分解是不是滿足dp的一些性質,初始狀態是什麼;當發現定義的狀態沒法轉移時,可以考慮將狀態細化,即:增加陣列維度;通過確定的狀態推出狀態轉移方程。

2、遞推的方向,dp解決的問題是將大問題分解為小問題,狀態和狀態轉移方程一旦確定,那麼接下來就是要從小問題推出大問題。顯然,是從小問題開始遞推,小問題是什麼,其實也是乙個值得去思考的東西。特別是用遞推的方法寫**時,如何去表示乙個小問題,遞推過程中,如何滿足當要解決某個問題時與之相關的小問題都已經被解決了。

3、遞推的形式,遞推的形式可以總結為三種:(1)記憶化搜尋;(2)我為人人;(3)人人為我;基本上dp的題目這三種形式都可以用,記憶化搜尋是遞迴的,遞迴的自底向上的思想符合dp將大問題分解為小問題,先解決小問題,再用小問題推出大問題的解的過程。所以這種形式的**比較簡單好寫,而且易懂。但缺點是比遞推要耗時一點。後面兩種是遞推的,具體意思,一看名詞就能夠理解到,這裡就不一一述說啦。

4、空間的優化,由於dp是用時間換空間,在降低時間複雜度的同時,也增加了空間複雜度。這樣,在解決問題中就有可能出現,超記憶體的情況。所以dp中要注意空間的優化。

一些經典的例子是01揹包和lcs的優化,利用滾動陣列。dp的空間優化,主要看狀態轉移方程。看下當前狀態的最優解與前面的哪些狀態有關,那些無關的部分可以不要,直接用滾動陣列的方式將其覆蓋就行。

總之,dp的問題還是比較活的,真正能把握的東西不是很多,需要做大量的題目來增加對dp的敏感性。更重要的是需要自己 去思考,去問為什麼。在做題中去積累一些經驗。

對動態規劃和貪心演算法的一點理解

一直很模糊的感覺這兩個重要的演算法應該有些聯絡。首先都是求解最優問題的很有效的方法,其次都有明顯的最優判定 通過對某些值的max和min 運算來決定下一步的步驟。具體的異同自己就說不清楚了,關鍵是對動態規劃演算法本身也不是特別理解。今天看了一下mit的演算法導論的相關章節,算是有了個大 概認識。題外...

對狀壓dp的一點理解

博主是初學者,以下僅代表個人觀點,若有錯誤歡迎指出。狀壓dp 此dp可以理解為最暴力的dp,因為他需要遍歷每個狀態,所以將會出現2 n的情況數量,所以明顯的標誌就是資料不能太多 好像是 16?然後遍歷所有狀態的姿勢就是用二進位制來表示,01串,1表示使用,0表示未使用,就把所有的狀態投射到很多二進位...

對狀壓dp的一點理解

最近學習了狀壓dp,既然是dp和其他的dp思想是一致的都是找到轉移方程轉移方法然後轉移就行。不同的在於狀壓dp利用了二進位制把乙個狀態記錄成乙個二進位制數。由於過去dp練習的多,刷一兩道題直接算是入門了。下面上兩道洛谷的入門狀壓dp 題意 給定乙個01矩陣,要求找出內部包含的滿足沒有相鄰1的方案數為...