題目描述
在乙個園形操場的四周擺放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...