動態規劃
我在學習演算法的時候,就被動態規劃搞得是一頭霧水,這幾日終於是弄明白是怎麼回來。
明白之後我才發覺我以前就碰到過一道acm題,大意是這樣的:
有這樣形式的一種排列:
例如:7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
從頂至下找一條路徑,使得這條路徑上的數字之和最大,而且每一步只能向左下或右下找,直到到最後一行。
比如:第二行的3只能找第三行8或者1。
上面例子的最大一條路徑是:7-3-8-7-5;總和30(原題:
如果按照貪婪演算法,從上往下找,則最佳路徑應該是7-8-1-7-5;總和28
可見貪婪演算法在此是行不通的。我們可以試著從下往上找,倒數兩行:
2 7 4 4
4 5 2 6 5
我們先對最後一行相鄰的兩個數字進行比較,大的加到上一行的數字上。則4-5比較5較大則倒數第二行2+5;
5-2比較5較大,則倒數第二行7+5,如此類推:則倒數第二行就是:
7 12 10 10;
然後依此類推:直到第一行,就得到了最大的和,當然原題沒有要求我們找路徑,所以不用記錄路徑.
其實這就是一種動態規劃的應用。
它與貪婪法的區別,在此也能明顯地看出:
1:貪婪法,採取的是自頂向下,逐步找區域性最優,從而來達到,整體最優.
而動態規劃則是從下往上倒推,
比如在找第一行7的下乙個節點,它能有兩個種決策,乙個是第二行的3,乙個是第二行的8。由於有這兩種可能性,所以在進行,第二行至第三行的決策的時候,是依賴於上一步決策的。而且由於每一次決策所以產生的可能的狀態,都被保薦著,所以當所以找的決策不是最優決策時,可以回溯。
越說越麻煩了,一句話,就是動態規劃其實是以犧牲空間來換取決策的正確性.
動態規劃與貪婪演算法 剪繩子
題目 給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘 積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此 時得到最大的乘積18。1 動態規劃 因為不知道剪在哪個位置是...
常見演算法思想之動態規劃 貪婪演算法
最近總是跟動態規劃打交道,索性就將其弄明白一點。所謂的動態規劃並不是一種具體的演算法,而是一種演算法的思想。思想總是抽象的,縹緲的。所以在學習動態規劃的時候會有一種很尷尬的情況,就是感覺這個東西很簡單,但是又不知道自己是不是真的學會了。簡單的來說,動態規劃就是將乙個大問題分解為子問題,然後根據子問題...
分治 動態規劃 貪婪 之 演算法分析
分治與動態規劃都用到了遞迴的思想,但是對他們之間的區別在概念上一直比較模糊,今天附帶貪婪選擇稍微整理一下他們。演算法之道上說,標準分治 動態規劃 貪婪選擇稱得上是孫子兵法的下 中 上策。標準分治 雖然將大問題分解成小問題,但是每個小問題都需要解決,相當於逢城必攻實屬下策 動態規劃 則聰明地發現,很多...