演算法導論 動態規劃 鋼條切割

2021-08-06 02:18:17 字數 947 閱讀 5820

這幾天一直在看動態規劃的問題,看了看也沒想象中那麼難,但需要好好的分析一下問題,我們就拿演算法導論的鋼條切割問題好好理解一下,鋼條切割問題就是給你一段鋼條,讓你把鋼條切割成好多份,因為每一段鋼條都有不同的價值,我們要找到最優的切割方案,使切割成的鋼條價值最大。

這道題我們可以用dfs直接搜尋,對每個狀態進行遞迴搜尋找到最優解,而用dfs時我們會遍歷到許多曾經計算過的點,所以它的複雜度會隨著點的增加呈**式增長,複雜度為o(2^n),這是我們為了簡化那些已經曾經計算過的點,就需要引入動態規劃的思想。樸素遞迴演算法的效率之所以很低,是因為它反覆求解相同的子問題,如果我們對每個子問題只求解一次,然後儲存它的值,在遇到的時候就不用求解,就能大大節省遞迴的時間。這就是典型的用空間換時間的方法。

動態規劃有兩種等價的實現方法:

1.帶備忘錄的自頂而下的方法:這種方法任然按照dfs的方法去寫,但在寫的時候要記錄每個計算過的值,在遞迴的時候要先看以前有沒有計算過,如果計算過就直接用就好。這種方法也就是記憶化搜尋,對搜尋的值進行備忘。

2.自底而上法:最優解的情況需要將子問題分解成子子問題,直道分解成已經解決的問題,那麼我們可以先將最小的子問題都解決出來,然後從小到大一次解決問題,當我們解決這個問題時,這個問題的所有子問題都已求解完成,也就是每個子問題我們只用求解一次。

兩種方法具有相同的複雜度,自頂而下的方法並沒有解決所有可能的子問題,由於沒有頻繁的遞迴函式的呼叫開銷,自底而上的方法複雜度通常會比自頂而下的方法複雜度小

下面這個**是用了自底而上的方法實現的,而且其中還記錄了路勁,可以返回到底分割成了哪幾塊

#include

using

namespace

std;

int value[15]=;

int main()

,step[100]=;

cin>>n;

for(int i=1;i<=n;i++)

動態規劃 鋼條切割《演算法導論》

給定各長度鋼鐵單位 以及乙個長度為n的鋼條,求最大效益 1 10 分別為p include includeint memorized cut rod aux int p,int len,int r 樸素遞迴演算法 演算法複雜度為2 n級這裡寫 int cut rod int p,int len in...

演算法導論 動態規劃之鋼條切割

動態規劃和分治策略相似,不同的是,它針對的問題所分解出的小問題數量很多且很多是重複的。動態規劃就是使得這些重複的小問題只需要計算一次,避免重複計算。鋼條切割問題 給定一段長度為n英吋的鋼條和乙個 表pi i 1,2,n 求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n英吋的鋼條的 pn足夠大...

鋼條切割 演算法導論

給定長度任意長度的鋼條的價值,求解如何切割,使給定長度為n的鋼條的價值最大。對於長度為n的鋼條,考慮子問題,我們遍歷1 n的第乙個切割的位置j,即得到長度為j和n j的兩段鋼條,第一段不再切割,僅對第二段繼續切割,遞迴求解,於是就得到了乙個遞迴解法。這裡是c語言實現 define crt secur...