• BZOJ 4518 征途


    斜率优化。又是变量名打错看了老半天。

    把方差式子展开一下就好了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 3050
    #define inf 0x7f7f7f7f7f7f7f7fLL
    using namespace std;
    long long n,m,a[maxn],sum[maxn],dp[maxn][maxn],rk[maxn],l,r,q[maxn];
    double k(long long x,long long y)
    {
        if (sum[x]==sum[y]) return inf;
        return (double)(rk[x]-rk[y])/(sum[x]-sum[y]);
    }
    void k_dp()
    {
        for (long long i=1;i<=n;i++) dp[1][i]=sum[i]*sum[i];
        for (long long i=2;i<=m;i++)
        {
            l=r=1;q[l]=i-1;
            for (long long j=i-1;j<=n;j++) rk[j]=dp[i-1][j]+sum[j]*sum[j];
            for (long long j=i;j<=n;j++)
            {
                while ((r-l) && (k(q[r-1],q[r])>k(q[r],j))) r--;
                q[++r]=j;
                while ((r-l) && (k(q[l],q[l+1])<=2*sum[j])) l++;
                dp[i][j]=dp[i-1][q[l]]+(sum[j]-sum[q[l]])*(sum[j]-sum[q[l]]);
            }
        }
    }
    long long get_ans()
    {
        return dp[m][n]*m-sum[n]*sum[n];
    }
    int main()
    {
        scanf("%lld%lld",&n,&m);
        for (long long i=1;i<=n;i++) {scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];}
        k_dp();
        printf("%lld
    ",get_ans());
        return 0;
    }
  • 相关阅读:
    MVC之路由规则 (自定义,约束,debug)
    MCV之行为
    mvc之页面强类型
    Jquery异步上传图片
    三层VS控制器
    Oracle 表分区
    C#编写的通过汉字得到拼音和五笔码
    MYSQL存储过程学习
    Sina App Engine(SAE)入门教程(9)- SaeMail(邮件)使用
    状态CSS
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6226413.html
Copyright © 2020-2023  润新知