【BZOJ1010】【HNOI2008】玩具装箱toy 动规_斜率优化

第一道斜率优化题,题解仍然不是很透彻。

我在这里可以推荐一篇博客。

http://blog.sina.com.cn/s/blog_5f5353cc0100jx41.html

写得还好,但是可能有一些地方仍说的不是很明白。

我说一下我对斜率优化的理解:

就是发现某道动态规划的题会TLE,然后它又恰巧符合某些丧心病狂的性质时的一种优化。

本质是有限度地捏造出一种性质,使得动规方程满足某种邪恶的单调性,从而得到大幅度的优化。

而这个单调性是怎么得到的呢?

就是我们把原转移状态搞出来,一顿转化,比如把平方拆开等,本来有两种转移j->i和k->i,我们使它原来有一个大小关系DP[j->i]<=DP[k->i],而最终转化成左边是一个有j和k的式子,右边是一个只有i的式子,这样达到高速判断两个转移哪家强的目的。

而思想上wyf给我说了一个好理解的版本如下。

就是它!我们要维护一个凸壳,当i要加入优先队列判断j->i的斜率和k->i的斜率,然后显然k出去了,再判断h->i,嗯,留下来了,就是这样。

好了,说一些跟本题相关的具体东西。

就是首先定义f[i]=sum[i]+i,这个sum[i]是前缀和。

然后有当G(j,k)/S(j,k)<=i时j比k优。

#define G(x,y) (dp[x]-dp[y]+(f[x]+c)*(f[x]+c)-(f[y]+c)*(f[y]+c))
#define S(x,y) (2*(f[x]-f[y]))

贴代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 55000
#define G(x,y) (dp[x]-dp[y]+(f[x]+c)*(f[x]+c)-(f[y]+c)*(f[y]+c))
#define S(x,y) (2*(f[x]-f[y]))
using namespace std;
long long c,sum[N],f[N],dp[N];
int n,q[N];
int main()
{
//	freopen("test.in","r",stdin);
	scanf("%d%lld",&n,&c);c++;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&sum[i]);
		sum[i]+=sum[i-1];
		f[i]=sum[i]+i;
	}
	int head=1,tail=1;
	q[1]=0;
	for(int i=1;i<=n;i++)
	{
		while(head<tail&&G(q[head+1],q[head])<=S(q[head+1],q[head])*f[i]) head++;
		dp[i]=dp[q[head]]+(f[i]-f[q[head]]-c)*(f[i]-f[q[head]]-c);
		while(head<tail&&G(i,q[tail])*S(q[tail],q[tail-1])<=G(q[tail],q[tail-1])*S(i,q[tail]))tail--;
		q[++tail]=i;
	}
	printf("%lld\n",dp[n]);
	return 0;
}
时间: 2024-12-30 02:25:15

【BZOJ1010】【HNOI2008】玩具装箱toy 动规_斜率优化的相关文章

bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][Status][Discuss] Description P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理

BZOJ1010: [HNOI2008]玩具装箱toy

[传送门:BZOJ1010] 简要题意: 给出n条连续线段,每条线段都有长度为x[i],我们可以把连续若干条线段连在一起,变成一个组合,两条线段如果相连,就要在两条线段中间添加一个长度为1的格子(如果没有相连就不用添加),假如我们现在选择把第i条到第j条线段之间的所有线段变成一组合的话,这个组合的总长度就为:x[i]+x[i+1]+x[i+2]+x[i+3]+...+x[j]+j-i,现在给出一个常数L,假设当前选择的组合的长度为s,那么这个组合就为我们产生了(s-L)^2的费用,求出把n条线段

【斜率优化】BZOJ1010 [HNOI2008]玩具装箱toy

[题目大意] P教授有编号为1...N的N件玩具,第i件玩具长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关, 如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量.求最小费用. [思路] 懒得说了,把WC宋新波老师的课件搬运一下. 宋新波老师讲的很好,WC的时候第一次听斜率优化听他讲完秒懂了,时隔几个月再来消化一下.

[BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<

bzoj1010: [HNOI2008]玩具装箱toy(斜率优化DP)

codevs也有这题,伪·双倍经验233 首先朴素DP方程很容易看出:f[i]=min(f[j]+(i-j-1+sum[i]-sum[j]-L)^2); 于是设g[i]=i+sum[i] g[j]=j+sum[j] c=1+L 则f[i]=min(f[j]+(g[i]-g[j]-c)^2) 证明决策单调性,假设 j 比 k 优 f[j]+(g[i]-g[j]-c)^2<f[k]+(g[i]-g[k]-c)^2 证明f[j]+(g[x]-g[j]-c)^2<f[k]+(g[x]-g[k]-c)^

BZOJ1010:[HNOI2008] 玩具装箱toy(斜率优化)

题意 求将一个长为\(n\)的序列(每个数为\(c_i\))分为很多段,每段(\(i\)~\(j\))的花费是\((j-i+\sum_{k=i}^{j}c_k-L)^2\),求最小的花费.(\(n<=50000\)) 题解 容易看出\(dp\)式子如下 \(dp[i]=min\{dp[j]+(sum[i]-sum[j]+i-(j+1)-L)^2\} \quad (j < i)\) 这个式子为\(O(n^2)\)的复杂度,显然过不去,我们进行一下斜率优化就能优化一维枚举决策点的复杂度,变成\(O

HNOI2008 玩具装箱toy (BZOJ1010,斜率dp)

传送门 1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Description P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的. 同时如果一个一维容器中有多个玩具,那么两件玩

BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

BZOJ 1010 [HNOI2008]玩具装箱toy

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P