```import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int N=310;
int f[][]=new int[N][N];//i到j区间的某个属性值
int s[]=new int[N];
for(int i=1;i<=n;i){
s[i]=sc.nextInt();
}
for(int i=1;i<=n;i) {
s[i]+=s[i-1];//前缀和
}
for(int len=2;len<=n;len++){//代表有几堆石子
for(int i=1;i+len-1<=n;i++){//确定长度确定起点,就确定了终点
int l=i,r=i+len-1; //终点=起点+长度-1
f[l][r]=Integer.MAX_VALUE;
for(int k=l;k<r;k++){ //k=r是f[k+1][r]无意义,k取有可能的任意数
f[l][r]=Math.min(f[i][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
//最后一次合并的分界线k来分,最后一次合并一定是区间的总和,所以代价会累加到最后一个值
}
}
}
System.out.println(f[1][n]);
}
}
···