区间dp模板
for(int i=1;i<=n;i++)
{
dp[i][i]=初始值
}
for(int len=2;len<=n;len++) //区间长度
for(int i=1;i<=n;i++) //枚举起点
{
int j=i+len-1; //区间终点
if(j>n) break; //越界结束
for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);
}
}
#include <bits/stdc++.h>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstdlib>
#include<map>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
int n,sum[110],a[110],dp[110][110];
int main()
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
for(int i=0;i<110;i++)
for(int j=0;j<110;j++)
dp[i][j]=inf;
for(int i=1;i<110;i++)
dp[i][i]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]+=sum[i-1]+a[i];
}
for(int len=2;len<=n;len++)//区间长度
for(int i=1;i<=n;i++)//枚举起点
{
int j=i+len-1;
if(j>n) break;
for(int k=i;k<j;k++)//枚举分割点
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
printf("%d",dp[1][n]);
return 0;
}