(1)基本思想:
動態規劃演算法的基本思想與分治法類似:將待求解的問題分解成若干個子問題,先求解子問題,然後從這些子問題的解中得到原問題的解。但是,與分治法不同的是,為了避免重複多次計算子問題,動態規劃演算法用乙個表記錄所有已解決的子問題的答案,不管該子問題以後是否被利用,只要它被計算過,就將其結果填入表中。
(2)設計動態規劃演算法的步驟:
①找出最優解的性質,並刻畫其結構特徵
②遞迴地定義最優值
③以自底向上的方式計算最優值
④根據計算最優值時得到的資訊構造最優解
(3)動態規劃演算法的基本要素
①最優子結構性質
當問題的最優解包含了子問題的最優解時,稱該問題具有最優子問題結構。在動態規劃演算法中,利用問題的最優子結構性質,以自底向上的方式遞迴地從子問題的最優解逐步構造出整個問題的最優解。
②重疊子問題性質
在用遞迴演算法自頂向下解決問題時,每次產生的子問題並不總是新問題,有些子問題可能被反覆計算多次。動態規劃演算法利用這種子問題的重疊性質,對每乙個子問題只解一次,而後將其解儲存在乙個**中,當再次需要解此子問題時,只需要簡單地用常數時間檢視一下結果即可。
從一般意義上講,問題所具有的最優子結構性質和重疊子問題性質是該問題可用動態規劃演算法求解的基本要素。
③備忘錄方法
備忘錄方法是動態規劃演算法的變形。與動態規劃演算法一樣,備忘錄方法用**儲存已解決的子問題的答案,在下次解決問題時,只要簡單地檢視該子問題的解答,不必再次計算。與動態規劃演算法不同的是,備忘錄方法的遞迴方式是自頂向下的,而動態規劃演算法則是自底向上的。
備忘錄方法為每個子問題建立乙個記錄項,初始化時,該記錄項存入乙個特殊的值,表示該子問題尚未求解。在求解的過程中對每個待求解的子問題,首先檢視相應的記錄項。若記錄項儲存的是初始化的特殊值,則需要計算該子問題的解,並儲存在相應的記錄項中已備以後檢視。若記錄項儲存的不是初始值,則表示該子問題已被計算過,此時記錄項儲存的值即該子問題的解答。
(1)租用遊艇問題:長江遊艇俱樂部在長江上設定了n個遊艇出租站1,2,…,n。遊客可在這些遊艇出租站租用遊艇,並在下游的任何乙個遊艇出租站歸還遊艇。遊艇出租站i到遊艇出租站j之間的租金為r(i,j),1<=i
1 #include 2using
namespace
std;
3int
main()412
}13for(int m=2;m//
m表示要經過的出租站點
14for(int i=1;i<=n-m;i++) 21}
22}23 cout<1
][n];
24return0;
25 }
(2)單調遞增最長子序列:設計乙個o(n2)時間的演算法,找出由n個數組成的序列的最長單調遞增子串行的長度。
1int longest(int a, int
n)2
8for (int i = 1; i < n; i++) 15}
16}17}
18return max;//
返回最長的長度
19 }
一開始並不清楚怎麼運用動態規劃演算法來分析和完成題目,於是和小夥伴一起認真地討論題目的內容,研究了到底什麼是動態規劃演算法,再盡量地去理解它的思想之後,和兩個小夥伴一起完成這兩道程式設計題。在這個過程中,照著自己的理解、小夥伴們的討論以及借鑑了別的同學的建議和提醒,最終順利地完成了任務。
理解動態規劃演算法
動態規劃的思想是將乙個問題分解為若干子問題,並且子問題之間還有重疊,通過先求解這些子問題的最優解,將原問題的最優解通過這些子問題的最優解構造出來,從而得到原問題的最優解。由此可以得到動態規劃演算法的應用場景 若求乙個問題的最優解 通常是求最大值或者最小值 而且該問題能夠分解成若干個子問題,並且子問題...
動態規劃演算法的理解
動態規劃演算法主要的核心思想是 狀態和狀態轉移方程。怎麼理解這個問題呢?先拿到了乙個數字三角形的程式,閱讀了它的動態規劃的 但是看不明白!不明白在什麼地方呢?在具體的執行過程各個變數的變化方向。比如兩層for迴圈,i為逆序,j為次序。那麼這種執行次序就沒有辦法想象了。那就先不管上面的了,先看dag上...
動態規劃演算法的理解
恢復內容開始 1.對動態規劃演算法的理解 官方解釋 自己的理解 在解決乙個問題時,需要找出最優解。在最優解會有很多個小的子解組成,那麼在選擇子解的過程中需要篩選掉明顯不合適的解 因為所有的解都遍歷會耗費大量的時間 保留可能的最優解,就能節約求解的時間。2.程式設計第一題的核心 def length ...