問題描述:
一維陣列的每一項表示乙個石子堆,將相鄰兩個石子堆「合併」,指的是,將相鄰兩個陣列元素加到一起,並需要付出代價【即兩堆石子的重量之和】,求合併到一堆過程中損耗的價值最少為多少
如, 1, 3, 2, 5, 43,2合併: 1, 5, 5, 4 代價5
1,5合併,6,5,4 代價6
4,5合併 6, 9 代價9
6,9 合併 代價15
總代價 35.
這是乙個典型的區間型動態規劃問題,值的學習。
所要求的是花費最低的方案所造成的花費,因此集合就是所有可能花費的方案。
因為花費的數量與左右邊界有關,因此採用左右邊界表示該狀態空間,即
f(left, right) = left ~ right的石子堆合併的最小方案。
若設定left和right中間有乙個中間值k,則f(left, right) = f(left, k) + f(k + 1, right) + cost(j - i )
left到right的最小開銷 = k左半邊的最小開銷 + k右半邊的最小開銷 + 合併左右兩邊的開銷。
這題值的學習的是對區間動態規劃的處理:
最外層迴圈定義left到right的長度,第二層迴圈定義左邊界left,因此不必迴圈right,可以直接得到right:
right = i + len - 1
;
這樣做的好處是,外層迴圈可以專心的根據原序列進行遍歷,不必考慮兩者區間改變的複雜情況。
樸素dp**:
public
intstonesmerge
(int
nums)
int[
] f =
newint
[n][n]
; f[1]
[1]=
0;// 區間長度為2,才有合併的意義
for(
int len =
2; len < n; len++)}
}return f[1]
[n -1]
;}
DP之石子堆合併問題
1 相鄰 在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小。1 2 在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有...
dp演算法 石子合併問題
這兩天看了一下這個問題,原題是這樣的 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動相鄰的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 這個題目在第一次剛看的時候,一臉懵逼,題目看懂了,但是怎麼去求花費怎麼都沒有想明白,後來在網上看了一...
石子合併問題 DP演算法
石子合併問題 time limit 1000 ms memory limit 65536 kib problem description 在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演...