1. 問題描述:
設有n堆沙子排成一排,其編號為1,2,3,…,n(n<=100)。每堆沙子有一定的數量。現要將n堆沙子並成為一堆。歸併的過程只能每次將相鄰的兩堆沙子堆成一堆,這樣經過n-1次歸併後成為一堆。找出一種合理的歸併方法,使總的代價最小。
【輸入格式】
輸入由若干行組成,第一行有乙個整數,n(1≤n≤100);表示沙子堆數。第2至m+1行是每堆沙子的數量。
【輸出格式】
乙個整數,歸併的最小代價。
【輸入樣例】713
781621418
【輸出樣例】
2392. 解題思路:
首先這也是乙個多階段決策問題,所以考慮採用動態規劃來解。
然後研究一下每個決策(合併還是不合併)受哪個或者哪幾個因素影響。本題可以看作受兩個因素的影響:
(1)要決策的是第 i 堆。
(2)合併的是相鄰的一堆。
如果沒有(2)的話,我們可以大膽採用d[i]來儲存最優值,但因為有了(2),所以這樣就不行了。由(2)我們可以知道合併實際上是與兩堆相關聯的,所以可以根據這兩堆將所有堆分成兩部分,而第一部分又可以繼續分下去,想到這裡,便很容易設計出下面的狀態轉移方程:
d[i][j]=min,其中d[i][j]表示把第i到j堆合併成一堆的最小代價,wi,j表示第i到第j堆的石子數量之和。
有了這個轉移方程,很容易看出要按照長度(即j-i的值)進行迭代求解。
[小優化]
可以提前算出wi,j的值,這樣可以省掉乙個n的時間複雜度。
具體**可以參考:
動態規劃經典問題
from 實現在 維基百科對動態規劃的定義 動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於...
動態規劃經典問題
子串 在給定的字串中選取連續的一段 子串行 可以不連續,但是要保證出現的順序與原字串相同 比如字串abcdefg abc既是子串又是子串行 acd只是子串行 一 最大連續子串行和 給定乙個整數序列a1,a2 an。求最大的連續的子串行的和。比如的最大連續子串行的和為5 3 1 1 2 萬能列舉?每次...
動態規劃 經典問題
今天記錄下自己所學的動態規劃知識點 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 我自己理解的動態規劃實操兩部曲 第一曲 定義初始條件 第二曲 迴圈操作 以及狀態方程定義 我的第乙個動態規劃程式 題目資訊 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 看到最少 一般用動態規劃求解 1...