在圓形操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。input輸入有多組測試資料。
每組第一行為n(n<=100),表示有n堆石子,。
二行為n個用空格隔開的整數,依次表示這n堆石子的石子數量ai(0output
每組測試資料輸出有一行。輸出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。 中間用空格分開。sample input3
1 2 3
sample output9 11
我寫的是端點和區間長度式的。
環形主要處理的是,如何確定斷點,使環形變成我們熟知的線性。所以採用了斷環為鏈的手法。
將環形斷開然後將其複製一條,在接上。
如下:1 2 3
變成:1 2 3 1 2 3
**如下:
#include
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define ifn 0x3f3f3f
using namespace std;
int dp[210][210]; //將其複製為兩個
int ff[210][210];
int num[105];
int sum[210];
int main()}}
int a=ifn; int b=0;
for(int i=1;i<=n;i++)
cout } 有n堆石子,要合併成一堆,規則是只能和相鄰的合併,每次合併的代價是合併出的石子堆的石子數量,求最小花費。in 4 4 4 5 9 out 43 直接貪心只能取到區域性的最佳結果。方程是很明顯的,dp i j min dp i j dp i k dp k 1 j sum j sum i s i dp陣... 問題描述 在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。輸入檔案 輸入第一行為n n 1000 表示有n堆石子,第二行為n個用空... 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。假設dp 1 4 表示將區間1 4的石子合併所花費的代價。dp 1 4 可以劃分為dp 1 1 dp 2...石子合併問題(區間DP)
石子合併 (區間DP
石子合併 區間dp