石子合併 動態規劃(環形)

2021-08-11 19:20:19 字數 1123 閱讀 6627

1、問題描述:問題** nwpu noj 1148

在乙個圓形操場的四周擺放著n堆石子(n<= 100),現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,讀入石子堆數n及每堆的石子數(<=20)。選擇一種合併石子的方案,使得做n-1次合併,得分的總和最小; 比如有4堆石子:44 5 9 則最佳合併方案如下:

4 4 5 9 score: 0

8 5 9 score: 8

13 9 score: 8 + 13 = 21

22 score: 8 + 13 + 22 = 43

2、輸入

可能有多組測試資料。 當輸入n=0時結束! 第一行為石子堆數n(1<=n<=100);第二行為n堆的石子每堆的石子數,每兩個數之間用乙個空格分隔。

3、輸出

合併的最小得分,每個結果一行。

4、問題解析

這個問題和直線型的區別在於最後一堆和第一堆也是相鄰的,可以把圓形轉換成直線型,把問題擴充套件為2n-1堆石子,舉個例子,如果環形石子堆是4 4 5 9,那麼轉換成直線型就變成了 4 4 5 9 4 4 5,所以最終就不是計算  0~n-1了,而是在 0~n-1,1-n,2-n+1,...,n-1~2n-2中選擇最小的。計算方法和直線型的相同。

5、**如下:(已經提交過驗證)

#include#includeusing namespace std;

int main()

for (i = n; i <= 2*n - 2; ++i)

//給min賦值

for (i = 0; i <= 2*n-2; ++i)

for (i = 2*n - 3; i >= 0; --i) //end for k

for (k = i; k < j; ++k)

}//end for k

min[i][j] = sum + tmp;

sum = 0;

tmp = int_max;

}// end for j

}// end for i

//選出長度為n的最小的值

int min = int_max;

for (i = 0; i < n; ++i)

cout <

動態規劃 石子合併

題目描述 在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石...

石子合併動態規劃

在乙個園形操場的四周擺放n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n ...

詳解動態規劃石子合併問題 直線型, 環形

在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,合併的花費為這相鄰兩堆之和 試設計出1個演算法,計算出將n堆石子合併成1堆的最小花費和最大花費.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別...