石子合併優化

2022-03-19 19:34:32 字數 1065 閱讀 3700

題目描述

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出1個演算法,計算出將n堆石子合併成1堆最大得分.

輸入格式

資料的第1行試正整數n,1≤n≤2000,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.

輸出格式

輸出共1行,最大得分

樣例

樣例輸入

4

4 4 5 9

樣例輸出

54
思路分析

轉移方程:f[i][j]=max(f[i][j-1],f[i+1][j])+sum[j]-sum[i-1]

另外還有就是四邊形不等式優化的證明現對複雜,**一下:四邊形不等式優化詳細證明

**

#include#include#include#includeusing namespace std;

const int maxn=4010,inf=0x3f3f3f3f;

int n,m,f[maxn][maxn],ans,a[maxn],sum[maxn];

int main()

for(int i=n+1;i<=2*n;i++)

for(int d=2;d<=n;d++)

}int ans=0;

for(int i=1;i<=n;i++)

printf("%d",ans);

return 0;

}

石子合併,GarsiaWachs演算法優化

思路 可以發現樸素的區間dp已經不足以解決這個問題了。對於石子合併問題,有乙個最好的演算法,那就是garsiawachs演算法。時間複雜度為o n 2 設序列是stone maxn 從左往右,找到乙個最小的且滿足stone k 1 stone k 1 的k,找到後合併stone k 和stone k...

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。分析 假設有n堆石子需要合併,可以設計乙個2 n 1個元素的陣列來儲存每堆石子的個數。...

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。沒有用dp 感覺一般的也能寫,時間複雜度也不高。include include inc...