石子合并之一

描述

给定一正整数序列,例如: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 }
原文地址:https://www.cnblogs.com/sbwll/p/13380984.html