本文为原创???

作者写这篇文章的时候刚刚初一毕业……

如有错误请各位大佬指正


从例题入手

洛谷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的更多相关文章

  1. 洛谷3195 [HNOI2008]玩具装箱TOY(斜率优化+dp)

    qwq斜率优化好题 第一步还是考虑最朴素的\(dp\) \[dp=dp[j]+(i-j-1+sum[i]-sum[j])^2 \] 设\(f[i]=sum[i]+i\) 那么考虑将上述柿子变成$$dp ...

  2. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  3. 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...

  4. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  5. 洛谷 P3195 [HNOI2008]玩具装箱TOY

    题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...

  6. [洛谷P3195][HNOI2008]玩具装箱TOY

    题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...

  7. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

  8. 洛谷 P3195 [HNOI2008] 玩具装箱

    链接: P3195 题意: 给出 \(n\) 个物品及其权值 \(c\),连续的物品可以放进一个容器,如果将 \(i\sim j\) 的物品放进一个容器,产生的费用是 \(\left(j-i+\sum ...

  9. 洛谷P3195 [HNOI2008] 玩具装箱 [DP,斜率优化,单调队列优化]

    题目传送门 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N ...

随机推荐

  1. nmon服务器性能结果报告分析

    一.nmon命令 ./nmon_x86_64_centos7 -f -s 10 -c 60 -m ./log/  命令的含义是: -f :按标准格式输出文件名称:<hostname>_YY ...

  2. Tkinter 之pack布局

    一参数说明 参数 作用 anchor 控制组件在 pack 分配的空间中的位置"n", "ne", "e", "se", ...

  3. C语言应用--数据类型定制一结构体数组

    结构体定义成功后,其实和c语言内部的类型区别也不大了,自然可以用来定义结构体类型的数组了.我们根据结构体定义的方式不同,分别用多种方式定义结构体数组:

  4. BeanFactory 简介以及它 和FactoryBean的区别

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  5. 微信小程序侧边栏滑动特效(左右滑动)

    侧边栏滑动是很常见的功能,但是小程序出来不久,很多特效还没有成熟案例,只能原生重写,所以今天为大家带来4个漂亮的侧边栏特效~~ 侧边栏特效一 先看效果: wxml: <!--page/one/i ...

  6. Thingsboard学习之二安装Docker和Docker-Compose

    安装系统更新系统,参考<Thingsboard学习之一CentOS安装系统更新> 尝试更新系统 yum update 增加一个用户并设置密码,并将用户增加到管理员 # 添加用户(可选) s ...

  7. Java List 和 Array 转化

    List to Array List 提供了toArray的接口,所以可以直接调用转为object型数组 List<String> list = new ArrayList<Stri ...

  8. 002-demo业务说明

    一.demo基本业务功能介绍 只是demo,无完整功能,不断重构系统,以搭建 高可扩展性.高性能.大数据.高并发.分布式的系统架构 客户管理.商品管理.购物车.订单管理.库存管理 二.基本数据字典 说 ...

  9. mysql 对应数据库服务器配置 所能承受的tps和qps

    总结: 吞吐量实际涵盖了TPS 和 QPS TPS 是指产生事物的请求,比如对数据库 增.删.改 QTP 是对数据库查询动作,无逻辑非事物,比如 查询 假如脚本里面都是get请求,那么出来的吞吐量就是 ...

  10. pyecharts绘画优美图形

    常用图形:柱形图-折线图-饼图-散点图 from pyecharts import Line, Bar, Pie, EffectScatter # 数据 attr =["衬衫", ...