1. 程式人生 > 實用技巧 >石子合併之一

石子合併之一

描述

給定一正整數序列,例如:4,1,2,3,在不改變數的位置的條件下把它們相加,並且用括號來標記每一次加法所
得到的和。例如:((4+1)+ (2+3))=((5)+(5))=10。除去原數不4,1,2,3之外,其餘都為中間結果
,如5,5,10,將中間結果相加,得到:5+5+10=20,那麼數20稱為此數列的一個代價,若得到另一種演算法:(4+
((1+2)+3))=(4+((3)+3))=(4+(6))=10,數列的另一個代價為:3+6+10=19。若給出N個數,可加N-
1對括號,求出此數列的最小代價。
注:結果範圍不超出longint.

輸入

第一行為數N(1≤N≤200)
第二行為N個正整數,整數之間用空格隔開。

輸出

輸出僅一行,即為最少代價值。

樣例

輸入

4
4 1 2 3

輸出

19
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[10001],sum[10001];
 4 int f[1001][1001];
 5 int main() {
 6     scanf("%d",&n);
 7     memset(f,0x3f,sizeof(f));
 8     for(int i=1; i<=n; i++)
 9         cin>>a[i],sum[i]=sum[i-1
]+a[i],f[i][i]=0; 10 for(int len=2; len<=n; len++) { 11 for(int l=1; l<=n-len+1; l++) { 12 int r=l+len-1; 13 for(int k=l; k<r; k++) 14 f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]); 15 f[l][r]+=sum[r]-sum[l-1]; 16 } 17 } 18 printf("
%d",f[1][n]); 19 return 0; 20 }