bzoj4518

来源:互联网 发布:seo网站编辑招聘 编辑:程序博客网 时间:2024/06/06 13:15

斜率优化。

把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);}


0 0
原创粉丝点击