zoukankan      html  css  js  c++  java
  • BZOJ1010: [HNOI2008]玩具装箱toy

    BZOJ1010: [HNOI2008]玩具装箱toy

    Description

    P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。

    他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。

    P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。

    同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j

    制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。

    P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过L。

    但他希望费用最小.

    Input

      第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

    Output

      输出最小费用

    Sample Input

    5 4
    3
    4
    2
    1
    4

    Sample Output

    1

    题解Here!
    斜率优化的入门题,然而并不是我做的第一道斜率优化。。。
    首先可以写出一个$DP$的递推式:$$dp[i]=min_{1<=j<=i-1}{dp[j]+(sum_{k=j+1}^ic_k+i-j-1-L)^2}$$
    注意到$sum_{k=j+1}^ic_k$可以预处理前缀和,于是变成了这样:$$dp[i]=min_{1<=j<=i-1}{dp[j]+(sum[i]-sum[j]+i-j-1-L)^2}$$
    又看到有个相同的式子$sum[i]+i$,继续设$sum[i]=sum_{k=1}^ic_k+i$,注意这里的$sum[i]$的含义变啦
    于是又变成了这样:$$dp[i]=min_{1<=j<=i-1}{dp[j]+(sum[i]-sum[j]-1-L)^2}$$
    这个显然$O(n^2)$的,铁定$TLE$。
    然后开始推限制:
    设$j$比$k$的转移更优,则有:$$dp[j]+(sum[i]-sum[j]-1-L)^2<dp[k]+(sum[i]-sum[k]-1-L)^2$$
    移项:$$(sum[i]-(sum[j]+1+L))^2-(sum[i]-(sum[k]+1+L))^2<dp[k]-dp[j]$$
    拆开平方:$$sum[i]^2-2 imes sum[i] imes (sum[j]+1+L)+(sum[j]+1+L)^2-(sum[i]^2-2 imes sum[i] imes (sum[k]+1+L)+(sum[k]+1+L)^2)<dp[k]-dp[j]$$
    合并同类项:$$2 imes sum[i] imes((sum[k]+1+L)-(sum[j]+1+L))<dp[k]-dp[j]+(sum[k]+1+L)^2-(sum[j]+1+L)^2$$
    设$f[i]=(sum[i]+1+L)^2$。
    原式变成:$$2 imes sum[i] imes(sum[k]-sum[j])<dp[k]-dp[j]+f[k]-f[j]$$
    除过去:$$2 imes sum[i]<frac{dp[k]-dp[j]+f[k]-f[j]}{sum[k]-sum[j]}$$
    然后就可以单调队列+斜率优化进行$DP$了。。。
    附代码:
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #define MAXN 50010
    #define MAX (1ll<<62)
    using namespace std;
    int n;
    long long m,sum[MAXN],f[MAXN],dp[MAXN];
    int head,tail,que[MAXN];
    inline int read(){
        int date=0,w=1;char c=0;
        while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
        while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
        return date*w;
    }
    inline long long square(long long x){return x*x;}
    inline double slope(int j,int k){
        return (double)(dp[k]-dp[j]+f[k]-f[j])*1.00/(sum[k]-sum[j]);
    }
    void work(){
        head=0;tail=0;
        f[0]=(m+1)*(m+1);
        for(int i=1;i<=n;i++){
            while(head<tail&&slope(que[head],que[head+1])<=sum[i]*2)head++;
            dp[i]=dp[que[head]]+square(sum[i]-sum[que[head]]-1-m);
            while(head<tail&&slope(que[tail-1],que[tail])>slope(que[tail],i))tail--;
            que[++tail]=i;
        }
        printf("%lld
    ",dp[n]);
    }
    void init(){
        n=read();m=read();
        for(int i=1;i<=n;i++){
            int x=read();
            sum[i]=sum[i-1]+x;
        }
        for(int i=1;i<=n;i++){
            sum[i]+=i;
            f[i]=square(sum[i]+1+m);
        }
    }
    int main(){
        init();
        work();
        return 0;
    }
    
  • 相关阅读:
    深入浅出 Application Insights--学习笔记
    .NET Core 在 K8S 上的开发实践--学习笔记
    传统.NET应用向微服务架构迁移的实践经验--学习笔记
    微服务快速开发框架的设计--学习笔记
    在.NET Core下的机器学习--学习笔记
    RPA AI .NET Core 与未来--学习笔记
    当我们在谈 .NET Core 跨平台时,我们在谈些什么?--学习笔记
    .Net Core + 微信赋能企业级智能客服系统--学习笔记
    用ASP.NET Core构建可检测的高可用服务--学习笔记
    ASP.NET Core基于K8S的微服务电商案例实践--学习笔记
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9473672.html
Copyright © 2011-2022 走看看