3 3 石子合併問題

2022-05-20 19:51:11 字數 1186 閱讀 1672

´問題描述:

在乙個圓形操場的四周擺放著 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堆石子,程式設計計算合併成一堆的最...