参考代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n;
int num[105]; //前i堆石子的数量总和
int f[105][105]; //把第i堆石子到第j堆石子合并的最优值
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int input;
scanf("%d",&input);
num[i]=num[i-1]+input;
}
//初始化
memset(f,127/3,sizeof(f));
for(int i=1;i<=n;i++)
{
f[i][i]=0; //不用合并
}
for(int i=n-1;i>=1;i--) //倒推
{
for(int j=i+1;j<=n;j++) //合并右边的直到j=n
{
for(int k=i;k<=j-1;k++) //合并
{
f[i][j]=min(f[i][j], //上一次的结果
f[i][k]+f[k+1][j]/*上一次的分*/+num[j]-num[i-1]/*本次的分*/); //看看从哪一个地方分最优
}
}
}
printf("%d",f[1][n]); //从1合并到n
return 0;
}