• [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp


    玩具装箱toy bzoj-1010 HNOI-2008

        题目大意: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。但他希望费用最小。

        注释:$1le nle 5cdot 10^4$,$1le L,c_ile 10^7$。

          想法:显然dp。状态特别简单,转移也特别简单。

            状态:dp[i]表示打包完前i个的最小代价。

            转移:$dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j)^2),1le j le i-1$。

          然后,过不去是显然的。我们在此介绍一种优化dp的算法:斜率优化。

          就是说,我将一个1D1D型的dp状态转移问题可以将一个装一状态变成一条直线,其中y=kx+b,b是当前需要转移的状态,钦定k是一个常数(这里,一切除了和dp[i]有关的且和i有关变量均可视为常数)。我们先将从1到i-1所有的点,从通过您列的直线解析式中的y和x的计算法则算一下,就可以得到i-1个点,把这i-1个点扔进坐标系。然后,我逐一钦定这i-1个点,将一条斜率为k的直线经过被钦定点。这样就会得到一个截距,有题目可知就能知道是最大截距还是最小截距。然后,我们以最大截距为例,首先先保证所有的转移方程在任何情况下k的正负都是确定的。紧接着我们得出了直接转移到dp[i]的点j(由于是取最小值,这里找到了一个满足最小值的方案),显然,之前不满足题意的之后一定也不满足题意,所以我们就可以把它删了... ...,这些类似的操作都可以用... ...单调队列来实现。具体地,大可直接看代码... ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int N=50100;
    ll s[N],Q[N],f[N],n,x,head,L,tail,j;
    inline double X(ll i)//返回单点横坐标
    {
    	return s[i];
    }
    inline double Y(ll i)//返回单点纵坐标
    {
    	return f[i]+(s[i]+L-1)*(s[i]+L-1);
    }
    inline double Rate(ll i,ll k)//返回两点斜率
    {
    	return (Y(k)-Y(i))/(X(k)-X(i));
    }
    int main()
    {
    	scanf("%lld%lld",&n,&L);
    	L++;
    	head=tail=1;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%lld",&s[i]);
    		s[i]+=s[i-1];
    	}
    	for(int i=1;i<=n;i++)
    	{
    		s[i]+=i;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		while(!(head>=tail)&&Rate(Q[head],Q[head+1])<2*s[i])head++;//维护单调队列
    		j=Q[head];f[i]=f[j]+(s[i]-s[j]-L)*(s[i]-s[j]-L);
    		while (!(head>=tail)&&Rate(Q[tail-1],Q[tail])>Rate(Q[tail],i))
    			tail--;Q[++tail]=i;//维护单调队列
    	}
    	printf("%lld
    ",f[n]);
    	return 0;
    }
    

        由于有了不小心磕々绊々の全球流(手白错误合计),以后所有的博客就不写错误了

        小结:斜率优化的作用在于优化dp qwq

        同届神犇blog,请配合食用

         给各位推荐一篇blog,写的超级详细。http://www.cnblogs.com/Paul-Guderian/p/7259491.html

  • 相关阅读:
    IntelliJ Idea 常用快捷键列表
    IPv6地址存储
    一文看懂java的IO流
    AchartEngine的柱状图属性设置
    绘制图表改变其大小
    在Android上用AChartEngine轻松绘制图表
    Android 图表绘制 achartengine 示例解析
    封装一个类搞定90%安卓客户端与服务器端交互
    安卓图表引擎AChartEngine(三)
    AchartEngine 的学习
  • 原文地址:https://www.cnblogs.com/ShuraK/p/8955786.html
Copyright © 2020-2023  润新知