#include <iostream>
using namespace std;
const int N = 255;
int w[N];
int sum[N]={0};
int dp[N][N];
int inf = 0x7fffffff;
int n;
int Minval()
{
int s[N][N];
for(int i =1;i<=n;i++)
{
dp[i][i]=0;
s[i][i]=i;
}
for(int len = 1;len<n;len++)
for(int i =1;i<=n-len;i++){
int j =i+len;
dp[i][j] = inf;
for(int k =s[i][j-1];k<=s[i+1][j];k++)
{
if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j])
{
dp[i][j]= dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
s[i][j]=k;
}
}
}
return dp[1][n];
}
int main()
{
while (cin>>n) {
sum[0]=0;
for(int i =1;i<=n;i++)
{
int x;
cin>>x;
sum[i]=sum[i-1]+x;
}
cout<<Minval()<<endl;
}
}
区间dp
最新推荐文章于 2024-05-19 11:46:40 发布