版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82051951
前言&链接&大意
同https://blog.csdn.net/xuxiayang/article/details/82051782
思路
原来的方程中的 是前缀和,这玩意满足
所以其满足四边形不等式
于是,我们只需要在最优的 之间转移即可,时间复杂度
代码
#include<cstdio>
#include<cstring>
using namespace std;int x,s[101],n,f[101][101],p[101][101];
signed main()
{
memset(f,127/3,sizeof(f));
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",&x),s[i]=s[~-i]+x,f[i][i]=0,p[i][i]=i;
for(register int i=n-1;i>0;i--)
for(register int j=i+1;j<=n;j++)
for(register int k=p[i][j-1];k<=p[i+1][j];k++)
if(f[i][k]+f[k+1][j]+s[j]-s[~-i]<f[i][j])
{
f[i][j]=f[i][k]+f[k+1][j]+s[j]-s[~-i];//动态转移
p[i][j]=k;//保存
}
printf("%d",f[1][n]);
}