区间DP1:282
作者:
总打瞌睡的天天啊
,
2024-10-17 14:30:54
,
所有人可见
,
阅读 1
//状态表示:f[i][j]表示:从第i堆到第j石子合并消耗的最小体力(区间)
//按最后一步看,将俩堆合成一堆,f[i][j]=f[i][k]+f[k+1][j]+s[l][r]
#include<iostream>
#include<algorithm>
using namespace std;
const int N=310;
int a[N];
int s[N];
int f[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
//区间长度应该由小到大
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int l=i,r=i+len-1;
f[l][r]=0x3f3f3f3f;
for(int k=l;k<=r-1;k++)
f[l][r]=min(f[l][k]+f[k+1][r]+s[r]-s[l-1],f[l][r]);
}
cout<<f[1][n]<<endl;
return 0;
}