原题链接:https://www.51nod.com/Challenge/Problem.html#!#problemId=1021
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn];
int a[maxn];
int sum[maxn];
int n;
int Sum(int start, int end){
return sum[end] - sum[start-1];
}
int main(){
memset(dp,0x3f,sizeof(dp));
memset(sum,0,sizeof(sum));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i] = sum[i-1] + a[i];
dp[i][i] = 0;
}
for(int len = 1; len <= n; len ++){ //枚举要合并的长度
for(int start = 1; start+len-1 <= n; start ++){ //枚举起点
int end = start + len - 1; //终点
for(int k = start; k < end; k++){ //枚举分割点
dp[start][end] = min(dp[start][end], dp[start][k] + dp[k+1][end] + Sum(start,end));
}
}
}
printf("%d\n", dp[1][n]);
return 0;
}