動態規劃與遞迴

2021-10-08 02:35:22 字數 1989 閱讀 7791

這裡借用leetcode的一道例題,來說一下動態規劃和遞迴的區別

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。

例如,給定三角形:

[[2],

[3,4],

[6,5,7],

[4,1,8,3]

]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

說明:如果你可以只使用 o(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。

這種問題,一看就知道遞迴最簡單了,但是這種遞迴方法其實就是一種暴力的全遍歷破解,**如下

//!遞迴函式

int recursive(vector>& ********, int ivecindex, int iinnerindex)

return min(recursive(********, ivecindex + 1, iinnerindex),

recursive(********, ivecindex+1, iinnerindex + 1)) + ********[ivecindex][iinnerindex];

}//!呼叫主函式

int minimumtotalrec(vector>& ********)

return recursive(********, 0, 0);

}

遞迴的方式既簡單,又容易理解,recursive引數為陣列,一級陣列的序列,二級陣列中的序列。每呼叫一次就求得此位置到最終位置的最小和,終止條件為

遞迴條件為:sum(a[m][n]) = min(sum(a[m+1][n]), sum(a[m+1][n+1])) + a[m][n];

終止條件:n == ********.size時(到達最底層時),直接返回此值。

當然遞迴帶來的***很明顯,效率太低,多次重複遞迴,

例如:sum(a[4][2]) = min(sum(a[5][2]), sum(a[5][3)) + a[4][2];

sum(a[4][3]) = min(sum(a[5][3]), sum(a[5][4)) + a[4][3];

sum(a[4][4]) = min(sum(a[5][4]), sum(a[5][5)) + a[4][4];

上面時遞迴過程,很明顯sum(a[5][3])和sum(a[5][4])重複遞迴兩次,很明顯我們遞迴了一些多餘的資訊。

這種情況如何去除冗餘呢?

動態規劃應運而生,當子問題是父問題的解時,父問題由乙個個子問題組成時,就用到了動態規劃,與遞迴從頂到下的邏輯不同的時,動態規劃是自底向上求解問題,每求得乙個結果又可以組成上一級的結果,最終求得最優解,由於其自底向上,就保證了不會有多餘的操作產生。那麼下面就看一下解決此問題的動態規劃演算法:

//!動態規劃

int minimumtotal(vector>& ********)

vectorvectotal(ivecsize, 0);

vectotal[0] = ********[0][0];

//!正向規劃

for (int iindex = 1; iindex < ivecsize; iindex++)

vectotal[0] += ********[iindex][0];

} int iminvalue = vectotal[0];

for (int ilastindex = 1; ilastindex < vectotal.size(); ilastindex++) }

return iminvalue;

}

上述演算法,每次迭代的對應著從第一行到第n行各個點的最小距離,而到第n+1行的距離又可以通過到第n行的最短距離求得,依次迭代,知道迭代到最後一行,此時就求的從第1行到最後一行的各個點最短距離,此時只要求出最小值就可以得出所求解。

js動態規劃與遞迴

動態規劃 從底部開始解決問題,將所有 小問題解決掉,然後合併成乙個整體解決方案,從而解決掉整個大問題 遞迴 從頂部開始將問題分解,通過解決掉所有分解的小問題來解決整個問題 計算斐波那契數列 function recurfib n else 遞迴 很多函式執行了多次 動態規劃使用乙個陣列儲存部分函式計...

暴力遞迴與動態規劃

1 漢諾塔問題。列印n層漢諾塔從最左邊移動到最右邊的全部過程。public static void main string args public static void method int n,string from,string to,string help method n 1,from,h...

動態規劃 遞迴

動態規劃是求解包含重疊子問題的最優化方法 1.基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解 注意 不是簡單分而治之 2.只能應用於有最優子結構的問題 即區域性最優解能決定全域性最優解,或問題能分解成子問題來求解 3.具有無後效性。它要求每乙個問題的決策,不能夠對解...