動態規劃程式設計是對解最優化問題的一種途徑,是解決多階段決策問題的一種方法。在每乙個階段都需作出決策,並影響到下乙個階段的決策。多階段決策問題,就是要在可以選擇的那些策略中間,選取乙個最優策略,使在預定的標準下達到最好的效果動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解 題方法,而不存在一種萬能的動態規劃演算法,可以解決各類最優化問題。
動態規劃問題運算量比較大,在本套專題中遇到的dp問題型別:類斐波那契數列問題,01揹包(以1019,1017題為例),完全揹包(以1022題為例),最長公升序子串行問題,最大公共子串行(以1002題為例)問題。
類斐波那契數列問題,指特徵方程類似於 f(n) = f(n-1) + f(n-2),的問題,此類問題最直觀的題就是斐波那契數列,稍微難一點的就是跳樓問題,和堆磚頭問題,這兩個題雖然看起來與斐波那契沒什麼關係,但是經過分析和轉化之後,就可以轉化為該型別。總的來說,類斐波那契數列問題是這套專題裡最簡單的問題,只要做會了幾個典型,其他的就很簡單了。
01揹包,一般描述為給定揹包的容積,一些物品的價值和體積,求能放入揹包中的物品的最大價值,乙個比較通用的公式為f[i, j] = max( f[i-1, j-wi] + pi (j >=wi), f[i-1, j] ),這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的。我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目要求「恰好裝滿揹包」時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f[0]為0其它f[1..v]均設為-∞,這樣就可以保證最終得到的f[n]是一種恰好裝滿揹包的最優解。如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將f[0..v]全部設為0。
完全揹包,這個問題非常類似於01揹包問題,所不同的是每種物品有無限件,也就是從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件、取1件、取2件……取[v/c]件等很多種。
最大公共子串行,又稱lcs,由於上課老師沒有講過,便自己學習了一下,這類問題一般描述為給定一定個字串,求出個個串最長的公共子串行的長度,這種問題的解決思路很巧妙,用乙個矩陣,行和列每個格仔代表乙個字元,分別表示出兩個字串,如圖,引進乙個二維陣列c,用c[i][j]記錄x[i]與y[j] 的lcs 的長度,b[i][j]記錄c[i][j]是通過哪乙個子問題的值求得的,以決定搜尋的方向。我們是自底向上進行遞推計算,那麼在計算c[i,j]之前,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來。此時我們根據x[i] = y[j]還是x[i] != y[j],就可以計算出c[i][j],即問題的解。
感想: 動態規劃問題,**量很少,乙個貪心或者搜尋問題,一般都會有五六十行**,而乙個dp問題的**量,往往就十幾行甚至更短,以至於真正的核心就那麼一行遞推公式。但這並不代表dp問題就簡單,做dp問題需要很強的邏輯思維和思考能力,做dp問題,是真正用「腦子」做題,不是像搜尋一樣,靠「模板」來巢狀。
心得:經過一段時間的刷題與適應,雖然最終的結果不盡如人意,但是在老師細心地講解,自己也努力的求師求解,在豆豆的幫助下,也算是完成了這一階段的學習,希望自己以後能更努力一點,天道酬勤!
練習三總結
一.動態規劃,它是解決 多過程問題的一種方法,它包括兩種思想 區域性原則和區域性最優原則 即把乙個問題通過狀態轉移方程 通常是遞迴 劃分成多個子問題,然後再按步驟尋找區域性最優解,這樣按步驟得到最優解。技巧 通過做這幾道題來看,有的題目完全就是可以通過dp,遞迴等別的方法來解決,動態規劃的優點是用乙...
專題三總結
這個專題講的是動態規劃的內容,到現在為止,已經做了3 個專題了,我個人認為,動態規劃這個專題還是挺好做的,沒有剛開始老師說的的那麼難。先來點理論知識吧。所謂動態規劃,它是解決多階段決策問題的一種方法。動態規劃的指導思想就是在做每一步決策時,列出各種可能的區域性解,依據某種判定條件,捨棄那些肯定不能得...
三 總結指標知識
根據陣列定義可知,其在一塊記憶體中連續分配了一批相同資料型別的變數,這也為使用陣列下標進行資料操作提供了可能。因為編譯器能根據資料型別大小和陣列下標以及首元素位址直接計算出需要訪問的變數的位址,從而實現下標訪問的功能,提高了開發程式的效率。1 a 是乙個常量,故只能做右值,表示整個陣列的位址,數值上...