演算法學習(十)動態規劃!!!

2021-09-24 11:34:15 字數 1475 閱讀 3437

1.先上一波官方解讀提提神:

動態規劃(英語:dynamic programming,簡稱dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 

動態規劃常常適用於有重疊子問題和最優子結構性質的問題。

官方術語太多?不能理解?what are you ****ing say???? :)

往下看,我的理解也許能夠幫助到你~~~

2.舉個栗子

最簡單的解法就是遞迴求解啦

private int fib(int n)
但是這樣的解法會有什麼問題呢?——我們看下面的圖(簡單列出斐波拉契前5個數的求解樹形圖)

按照遞迴的思路往下走:

f(x)=f(x-1)+f(x-2)...

f(x-1)=f((x-1)-1)+f((x-1)-2)...

f(x-2)=f((x-2)-1)+f((x-2)-2)...

直至走到底,好像一切都很順利:)

?誒?不對呀,

f(x-2)=3   ==  f((x-1)-1)=3

f((x-1)-2)=2  ==  f((x-2)-1)=2  ==  f(((x-1)-1)-1)=2

.............................再往下1?0?將會出現無數次重複計算

這!就是傳說中的——————————

如何解決重疊子問題呢?

很簡單,按照正常的思維也能想到~

不就是乙個問題重複計算嘛?我找個容器把它儲存起來,等要用的使用直接對應下標取出不就好了嗎?

這樣就避免了,頂層問題重複遞迴到最底層(本題中即到達0或者1的深度)求解造成的棧溢位問題

(為什麼會棧溢位?:)你可以用乙個50左右的數看看指數級增長曲線有多美,嘻嘻)

於是,我的第二種解法來了:

public class solution 

return fib[n];

}

——》分析**可以知道,fib[ ]就是我的容器

我從零搭建起這個容器,逐步往高層搭建的過程中,重複需要的f(x-1)或者f(x-2)就可以直接從容器中取,而不需要重新底層累加。

是不是很簡單?

至此,我們解釋了重疊子問題,並初步使用動態規劃解決了斐波那契數列帶來的重複計算問題,相信大家已經對動態規劃有了乙個初步入門的認識。

解釋最優子結構

演算法學習 動態規劃

動態規劃是解決多階段決策過程最優化的一種方法。對於離散問題,解析數學無法施展,動態規劃則成為非常有效的工具。兩個弱點 1.得出目標函式方程後,尚無統一的處理方法,必須根據具體問題的性質結合相應的數學技巧來求解 2.維數障礙。動態規劃模型的分類 根據決策過程的時間參量是離散的還是連續的變數 1.離散 ...

演算法學習 動態規劃實踐

完成日期 2017.10.26 1.實踐題目 數字三角形 2.問題描述 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。3.演算法描述 1 首先該問題有最優子結構和重疊子問題的性質,因...

演算法學習08 動態規劃

遞迴問題 暴力遞迴轉換成動態規劃 動態規劃本身就是暴力遞迴的優化,是一種用空間換時間的策略 動態規劃 我們不知道怎麼計算n 但我們知道 n 與 n 1 之間存在一定關係n n n 1 得到遞推的狀態轉移公式.當暴力遞迴到頭得到0 1,得到base case,這樣得到了遞迴的方法.public sta...