演算法 石子堆合併問題

2021-10-18 05:15:36 字數 1111 閱讀 7329

問題描述:

一維陣列的每一項表示乙個石子堆,將相鄰兩個石子堆「合併」,指的是,將相鄰兩個陣列元素加到一起,並需要付出代價【即兩堆石子的重量之和】,求合併到一堆過程中損耗的價值最少為多少

如, 1, 3, 2, 5, 4

3,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 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演...