斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
本文为原创???
作者写这篇文章的时候刚刚初一毕业……
如有错误请各位大佬指正
从例题入手
Step0:读题
Q:暴力?
如果您学习过dp
不难推出dp方程
设dp[i]表示放置前i个物品需要的最小价值
dp[i]=min(dp[j]+(sum[i]-sum[j-1]+i-j-L)^2)
sum[i]表示前缀和
暴力分有了!!恭喜!
下面我们引入斜率优化:
首先进行一个变形:
原来的式子可以变为:f[i]=min(f[j]+(sum[i]-sum[j]+i-j-L-1)^2)
令a[i]=sum[i]+i,b[i]=sum[i]+i+L+1
f[i]=min(f[j]+(a[i]-b[j])^2)
f[i]=min(f[j]+a[i]^2+b[j]^2-2*a[i]*b[j]) 初一公式!展开平方!
把b[j]看做x,f[j]+b[j]^2看做y
y=2*a[i]x+dp[i]-a[i]^2
这就是一条是直线的解析式!
y=kx+b,k=2*a[i],b=f[i]-a[i]^2
要找到一个点P(b[j],f[j]+b[j]^2)使得上面的斜率为2*a[i]的直线穿过这个点且与y 的轴截距最小
因为斜率k=2*a[i]是固定的,所以要求的就是最小的b,加上a[i]^2就是dp[i]的值。
很明显就是维护一个下凸壳
令a[i]=sum[i]+i
斜率单调递增!
code:推荐照着讲解看
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
#define un unsigned
#define ull un ll
#define int ull
using namespace std;
#define maxn 50009
int n,l,a[maxn];
int f[maxn],g[maxn];
int q[maxn];
int Q(int x){return x*x;}
double Get(un j,un k)//求斜率
{
return ((f[j]+Q(g[j])+*l*g[j])-(f[k]+Q(g[k])+*l*g[k]))/(double)(g[j]-g[k]);
}
signed main()
{
scanf("%llu%llu",&n,&l);
l++;
int s=,t=;
int K;
q[s]=;
for(int i=;i<=n;i++)
{
scanf("%llu",&g[i]);
g[i]=g[i]+g[i-];
}
for(int i=;i<=n;i++)g[i]+=i;
for(int i=;i<=n;q[++t]=i++)
{
K=g[i]<<;
while(s<t&&Get(q[s+],q[s])<=K) s++;
int j=q[s];
f[i]=f[j]+Q(g[i]-g[j]-l);
while(s<t&&Get(q[t],q[t-])>=Get(i,q[t]))t--;
}
printf("%llu\n",f[n]);
return ;
}
斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy的更多相关文章
- 洛谷3195 [HNOI2008]玩具装箱TOY(斜率优化+dp)
qwq斜率优化好题 第一步还是考虑最朴素的\(dp\) \[dp=dp[j]+(i-j-1+sum[i]-sum[j])^2 \] 设\(f[i]=sum[i]+i\) 那么考虑将上述柿子变成$$dp ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 洛谷 P3195 [HNOI2008]玩具装箱TOY
题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...
- [洛谷P3195][HNOI2008]玩具装箱TOY
题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- 洛谷 P3195 [HNOI2008] 玩具装箱
链接: P3195 题意: 给出 \(n\) 个物品及其权值 \(c\),连续的物品可以放进一个容器,如果将 \(i\sim j\) 的物品放进一个容器,产生的费用是 \(\left(j-i+\sum ...
- 洛谷P3195 [HNOI2008] 玩具装箱 [DP,斜率优化,单调队列优化]
题目传送门 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N ...
随机推荐
- Linux下java环境变量配置
安装步骤 1.查看当前Linux系统是否安装java rpm -qa | grep java 2.卸载系统中已经存在的openJDK rpm -e --nodeps java--openjdk-1.7 ...
- 隐藏tr
<tr id="yinchang" style="display: none"></tr> $("#yinchang& ...
- Jenkins 获取 Git 的提交记录(Change Log)
工作中用 Jenkins 做 iOS 和 Android 的持续集成,之前实现的是当 git 有新代码提交的时候,就会自动编译并上传安装包到蒲公英,然后自动发送QQ群通知或者讨论组通知给相关小伙伴,方 ...
- 实现一个hoverDelay延迟hover
实现一个hoverDelay延迟hover author: @TiffanysBear 需求背景 经常在页面开发中,需要使用hover事件来触发相应的网络请求或页面DOM元素显示切换,需要考虑的问题就 ...
- Git如何永久删除某个重要文件文件或文件夹 (包括历史记录) 强制
有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的), 而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必 ...
- npm package.json配置整理
通过npm init 创建 package.json文件 参数: name:项目名字 version: 版本号 description: 项目介绍 main: 项目的入口文件 scripts: npm ...
- ab 压测
Linux学习14-ab报错apr_pollset_poll: The timeout specified has expired (70007) 前言 使用ab压力测试时候出现报错apr_polls ...
- vue开发环境、正式环境的配置及原理
修改prod.env.js里的内容,修改后的内容如下: 'use strict' module.exports = { NODE_ENV: '"production"', EVN_ ...
- grub下如何指定哪个分区为根文件系统?
答: 使用root命令,如: grub> set root=(hd0,msdos1)
- FastCGI模式编译安装LAMP+Xcache
PHP的工作模式:php在lamp环境下共有三种工作模式:CGI模式.apache模块.FastCGI模式.CGI模式下运行PHP,性能不是很好.(已淘汰)FastCGI的方式和apache模块的不同 ...