動態規劃(一)鋼條切割

2022-01-31 21:49:36 字數 1420 閱讀 2064

什麼是動態規劃

答:動態規劃與分治法相似,都是通過組合子問題的解來求解原問題。他們之間的不同是,分治法將問題劃分為互不相交的子問題,而動態規劃應用於子問題重合的情況。使用分治法求解子問題重合的問題,會做許多不必要的工作,動態規劃將已經求解的子問題儲存到一張**中,從而避免了反覆求解重合子問題的情況。

動態規劃常用來解決什麼問題

答:最優化問題。最優化問題可以有很多可行解,每個解都有乙個值,我們希望尋找具有最優值的解,最大或最小。我們稱這樣的解是問題的乙個最優解(最優解可以有多個)。

設計動態規劃演算法的步驟

刻畫乙個最優解的結構特徵;

遞迴的定義最優解;

計算最優解的值,通常採用自底向上的方法;

利用計算出的資訊構造最優解;

從演算法的角度來思考,我們如果要解決乙個問題,只需要把這個問題的所有可能都列舉出來。通過來檢查每一種情況,來計算出乙個最優的解。我們如何來窮舉出所有的可能呢?

我們從鋼條的最左端開始,在鋼條長度為1的位置切割,那麼問題的解即是r(n) = p[1] + r(n-1),我們看到問題的規模減小了,我們可以遞迴的解決子問題r(n-1)。一般的,r(n) = p[i] + r(n-i),i = 1,2,... n。

/**

* 遞迴解法

* @param p

* @param n

* @return

*/public static int cut_rod(int p, int n)

return q;

}

遞迴的解法求解了很多不必要的子問題,而我們可以將求解過的子問題記錄下來。當遇到子問題時只需從**中查詢,這樣就避免買子問題的重複計算。

/**

* 帶備忘錄的自頂向下遞迴解法

* @param p

* @param n

* @return

*/public static int memoized_cut_rod(int p, int n)

return memoized_cut_rod_aux(p, n, r);

}public static int memoized_cut_rod_aux(int p, int n, int r)else

}r[n] = q;

return q;

}/** * 自底向上的解法

* @param p

* @param n

* @return

*/public static int bottom_up_cut_rod(int p, int n)

r[i] = q;

}return r[n];

}

演算法學習(動態規劃 一)鋼條切割

給定一段長度為n的鋼條和乙個 表,求切割鋼條方案,使得銷售收益最大 表 長度i123 4567 8910 p15 891017 1720 2430 經過分析,因為在距離鋼條左端i i 1,2,3 n 處,總是可以選擇切割或者不切割,因此可得,其共有2n 1種切割方案,以下是使用自頂向下遞迴實現的 該...

動態規劃 鋼條切割

一家公司購買長鋼條,將其切割成短鋼條 切割本身沒有成本,長度為i的短鋼條的 為pi。那給定一段長度為n的鋼條和乙個 表pi,求鋼條的切割方案使得收益rn最大。如乙個pi如下 長度i12 3456 78910 pi15 891017 1720 2430 在距離鋼條左端i長度處,我們總是可以選擇切割或者...

動態規劃 鋼條切割

這是演算法導論動態規劃的乙個例子,自己實現了一下 給定乙個長度為n英吋的鋼條和乙個 表pi i 1,2 n 求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n的鋼條 pn足夠大,則最優解可能就不需要切割。分析 如下 include include include using namespace...