動態規劃 石子合併

2021-08-08 23:46:12 字數 899 閱讀 1930

題目描述

在乙個圓形操場的四周擺放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次合併,...

動態規劃之合併石子

首先我們要搞懂什麼是動態規劃。我覺得動態規劃就是把乙個大問題分解為多個小問題,每個小問題的決策都會影響到下乙個小問題的決策。下乙個小問題的決策就是由上乙個小問題的決策而產生的。乙個狀態經過乙個決策變成了另外乙個狀態,這個過程就是狀態轉移,用來描述狀態轉移的方程就是狀態轉移方程。在乙個操場上一排地擺放...