题目:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021
推荐大家可以看看这个视频
https://www.bilibili.com/video/av12159085/
视频讲解更好理解
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=110;
const int inf=0x3f3f3f3f;
int dp[MAXN][MAXN],a[MAXN],sum[MAXN];
int main()
{
int N;
cin>>N;
int i,j,k,h;
for(i=1;i<=N;i++)
cin>>a[i],sum[i]=sum[i-1]+a[i];
for(h=1;h<N;h++)
{
for(i=1;(j=h+i)<=N;i++) //i表示开始位置,j表示区间末位置
{
dp[i][j]=inf;
for(k=i;k<=j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); //k表示分割的位置
}
dp[i][j]+=sum[j]-sum[i-1];
}
}
cout<<dp[1][N]<<endl;
return 0;
}