´問題描述:
在乙個圓形操場的四周擺放著 n 堆石子。現要將石子有次序地合併成一堆。規定每次只
能選相鄰的 2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計一
個演算法,計算出將 n 堆石子合併成一堆的最小得分和最大得分。
´程式設計任務:
對於給定 n 堆石子,程式設計計算合併成一堆的最小得分和最大得分。
´資料輸入:
由檔案 input.txt 提供輸入資料。檔案的第 1 行是正整數 n,1£n£100,表示有 n 堆石子。
第二行有 n 個數,分別表示每堆石子的個數。
´結果輸出:
程式執行結束時,將計算結果輸出到檔案 output.txt 中。檔案的第 1 行中的數是最小得
分;第 2 行中的數是最大得分;。
輸入檔案示例 輸出檔案示例
input.txt output.txt
44 4 5 9
4354
【題解】
f1[i][j]表示從i開始長度為j的最佳合併方案得分
f2[i][j]表示從i開始長度為j的最差合併方案得分
因為是個環所以把石頭的範圍擴充套件一下,擴充套件到n+1..2*n
列舉長度,列舉起點,列舉中斷點。
然後做dp就是了
【**】
/*
f1[i][j]表示從i開始長度為j的最佳合併方案得分
f2[i][j]表示從i開始長度為j的最差合併方案得分
*/#include #include #include #include using namespace std;
const int n = 100;
const int m = 1e4;
int n, s;
int f1[2*n + 10][n + 10], f2[2*n + 10][n + 10];
int a[2 * n + 10];
int main()
for (int l = 2; l <= n; l++)
} }int ma = f1[1][n], mi = f2[1][n];
for (int i = 2; i <= n; i++)
cout << mi << endl;
cout << ma << endl;
return 0;
}
282 石子合併
設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...
2298 石子合併
2008年省隊選拔賽山東 時間限制 1 s 空間限制 256000 kb 題目等級 gold 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。輸入描...
SSL 1597 石子合併問題
description 在乙個圓形操場的四周擺放著n 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。程式設計任務 對於給定n堆石子,程式設計計算合併成一堆的最...