斜率优化。
把m^2乘进式子里,优化式子。
注意初始化。
#include<cstdio>
#include<cstdlib>
#include<cstring>
long long a[3005];
long long f[3005][3005];
long long s[3005];
long long q[3005];
int t;
double Y(int j)
{
return (double)(f[t-1][j]+s[j]*s[j]);
}
double X(int j)
{
return (double)s[j];
}
double slop(int j1,int j2)
{
return (Y(j2)-Y(j1))/(X(j2)-X(j1));
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-1]+a[i];
}
memset(f,63,sizeof(f));
f[0][0]=0;
for (t=1;t<=m;t++)
{
int l=1,r=1;
q[1]=0;
for (int i=1;i<=n;i++)
{
while(l<r&&slop(q[l],q[l+1])<2.0*s[i])l++;
int k=q[l];
f[t][i]=f[t-1][k]+(s[i]-s[k])*(s[i]-s[k]);
while(l<r&&slop(q[r],q[r-1])>slop(q[r],i))r--;
q[++r]=i;
}
}
long long ans=f[m][n]*m-s[n]*s[n];
printf("%lld",ans);
}