題目描述
在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.
輸入輸出格式
輸入格式:
資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.
輸出格式:
輸出共2行,第1行為最小得分,第2行為最大得分.
輸入輸出樣例
輸入樣例
44 9 5 4
輸出樣例
4354
該問題的關鍵在於分段討論,先把1個,2個……n個石子合併的最優方法算出
sum[i][j]=sum[i][j-1]+sum[(i+j-1)%n][1];
再根據
dp[i][j]=min/max(dp[i][j],dp[i][k]+dp[(i+k)%n][j-k]+sum[i][j])(sum表示從第i個石子堆合併j個的最優方案) 算出最後答案。
#includeusing namespace std;
int main()
{ long long n,s[100][101],f[100][101],ss=0x7fffffff,s2=0;
scanf("%lld",&n);
for(int i=0;i
石子合併動態規劃
在乙個園形操場的四周擺放n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n ...
石子合併 動態規劃(環形)
1 問題描述 問題 nwpu noj 1148 在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,讀入石子堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,...
動態規劃之合併石子
首先我們要搞懂什麼是動態規劃。我覺得動態規劃就是把乙個大問題分解為多個小問題,每個小問題的決策都會影響到下乙個小問題的決策。下乙個小問題的決策就是由上乙個小問題的決策而產生的。乙個狀態經過乙個決策變成了另外乙個狀態,這個過程就是狀態轉移,用來描述狀態轉移的方程就是狀態轉移方程。在乙個操場上一排地擺放...