演算法 動態規劃

2022-10-11 06:15:14 字數 1017 閱讀 2668

分治法:將問題劃分為不相交的子問題,遞迴的求解子問題,在將它們的解組合起來,求出原問題的解。

動態規劃:通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

動態規劃和遞迴的最大的區別,就是在碰到重疊子問題時,是否只需要計算一次。

拆分子問題,把整體問題拆成可以用遞推或是遞迴實現的小問題,在某一狀態下最佳選擇是什麼

定義問題和狀態之間的關係,尋找到狀態轉移方程

進行編碼

陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 costi。

每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例 1:

輸入: cost = [10, 15, 20]

輸出: 15

解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。

示例 2:

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

輸出: 6

解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。

注意:

cost 的長度將會在 [2, 1000]。

每乙個 cost[i] 將會是乙個integer型別,範圍為 [0, 999]。

上公升到某級(i)有兩種方法,從i-1級上一步,從i-2級上兩步,那麼就可以知道狀態轉移方程了

dp[i] = math.min(dp[i - 1], dp[i - 2]) + cost[i],順著這個思路從3開始,最後再輸出一下就行。

public int mincostclimbingstairs(int cost) 

return math.min(dp[len - 1], dp[len - 2]);

}

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

動態規劃的定義 動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...