石子合併之一
阿新 • • 發佈:2020-07-26
描述
給定一正整數序列,例如: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 }