首页 > 其他分享 >斜率优化 dp 学习笔记

斜率优化 dp 学习笔记

时间:2023-08-14 22:24:44浏览次数:41  
标签:容器 ix 玩具 笔记 斜率 gety todo dp

仍然是算导风格的学习笔记

例题:[HNOI2008] 玩具装箱

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

P 教授有编号为 \(1 \cdots n\) 的 \(n\) 件玩具,第 \(i\) 件玩具经过压缩后的一维长度为 \(C_i\)。

为了方便整理,P 教授要求:

  • 在一个一维容器中的玩具编号是连续的。

  • 同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物。形式地说,如果将第 \(i\) 件玩具到第 \(j\) 个玩具放到一个容器中,那么容器的长度将为 \(x=j-i+\sum\limits_{k=i}^{j}C_k\)。

制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为 \(x\),其制作费用为 \((x-L)^2\)。其中 \(L\) 是一个常量。P 教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过 \(L\)。但他希望所有容器的总费用最小。


数组下标均从 \(0\) 开始。

  1. 设计一个 \(O(n^2)\) 的算法解决此问题。(提示:动态规划。)

  2. 考虑第 \(i(i \ge 2)\) 个物品之前的两个物品 \(j,k(j \lt k)\),何时从 \(k\) 转移至 \(i\) 优于从 \(j\) 转移至 \(i\)?(提示:表达式应只与 \(i,j,k\) 有关,而与它们之间的其他数无关;你可以预处理出一些数组。)

  3. 将上一问中的表达式变形为关于 \(\dfrac{f(k)-f(j)}{g(k)-g(j)}\) 的不等式,其中 \(f\) 和 \(g\) 可以自由设定。

  4. 考虑点 \((g(k), f(k))\) 和 \((g(i), f(i))\),上一问的不等式有什么几何意义?

  5. 设计一个 \(O(n)\) 的算法解决此问题。(提示:在线地维护一个凸包。)


参考做法:

#include <iostream>
#include <deque>
#include <vector>
#define UP(i,s,e) for(auto i=s; i<e; ++i)
using std::cin; using std::cout;
using ll = long long;
constexpr int N = 1e6;
namespace m{ // }{{{
int in, ia, ib, ic;
int ix_[N+1];
ll dp_[N+1];
#define mkvis(arr) auto &arr(int pl){ return arr##_[pl+1]; }
mkvis(ix) mkvis(dp)
std::deque<int> todo;
ll calc(int x){ return ia*1ll*x*x+ib*1ll*x+ic; }
auto gety(int idx){ return ia*1ll*ix(idx)*ix(idx) + dp(idx); }
void work(){
	cin >> in >> ia >> ib >> ic;
	UP(i, 0, in){
		cin >> ix(i);
		ix(i) += ix(i-1);
	}
	//dp(-1) = 0;
	todo.push_back(-1);
	UP(i, 0, in){
		while(todo.size() > 1){
			int fr = *todo.begin(), frr = *++todo.begin();
			if(gety(frr)-gety(fr) >= 1ll*(2*ia*ix(i)+ib)*(ix(frr)-ix(fr))){
				todo.pop_front();
			} else break;
		}
		{
			int bx = todo.front(); // bestx
			dp(i) = dp(bx) + calc(ix(i)-ix(bx));
		}
		while(todo.size() > 1){
			int ed = *--todo.end(), edd = *----todo.end();
			if((gety(ed)-gety(edd))*(ix(i)-ix(ed)) < 
					(gety(i)-gety(ed))*(ix(ed)-ix(edd))){
				todo.pop_back();
			} else break;
		}
		todo.push_back(i);
	}
	cout << dp(in-1);
}
} // {}}}
signed main(){std::ios::sync_with_stdio(0); cin.tie(0); m::work(); return 0;}

标签:容器,ix,玩具,笔记,斜率,gety,todo,dp
From: https://www.cnblogs.com/x383494/p/17629928.html

相关文章

  • 拓扑排序 学习笔记
    模板题分析题目求一个图的拓扑序。需要用到拓扑排序。拓扑排序将一张图中的顶点以线性方式进行排序,使得对于任何的顶点\(u\)到\(v\)的有向边\((u,v)\),都可以有\(u\)在\(v\)的前面。并且拓扑排序只能在有向无环图(DAG)中完成。做法:每次找到入度为\(0\)的顶点,将这......
  • 新人笔记-方法重载基本知识
    方法重载:多个方法在同一个类中多个方法具有相同的方法名多个方法的参数不相同,类型不同或者数量不同与返回值无关在调用时,Java虚拟机会通过参数的不同来区分同名的方法publicclassMethodDemo02{publicstaticvoidmain(String[]args){in......
  • 新人笔记-参数的传递
    publicclassMethodDemo03{publicstaticvoidmain(String[]args){intnumber=100;System.out.println("调用方法前"+number);change(number);System.out.println("调用方法后"+number);}publicsta......
  • 『学习笔记』插入类dp
    概述可以说是一个套路化问题,想出来了就非常好做。前提是你得想出来。转移方程一般也都是特定的:设\(dp_{i,j}\)表示往一个序列里插入了\(i\)个数,这\(i\)个数被分成了\(j\)段的方案数。初始化:\(\begin{cases}dp_{1,i=1}=1\\dp_{1,i\ne1}=0\end{cases}\).......
  • 学习笔记 - Java 数组
    数组的概述数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。数组是有序排列的,且数组属于引用数据类型,但数组中的元素既可以是基本数据类型,又可以是引用数据类型。数组的存储是在内存中开启一片连续的空间,长度一旦......
  • openGauss学习笔记-39 openGauss 高级数据管理-分区表
    openGauss学习笔记-39openGauss高级数据管理-分区表一张表内的数据过多时,就会严重影响到数据的查询和操作效率。openGauss支持把一张表从逻辑上分成多个小的分片,从而避免一次处理大量数据,提高处理效率。openGauss数据库支持这些划分类型:范围分区表:指定一个或多个列划分为多个......
  • 前端进化笔记-JavaScript(四)
    生活想要将我活埋,怎料我是一颗种子基本引用类型对象是引用类型的实例:new后面跟一个构造函数就创建了一个新对象,例如letnow=newDate();,这样就创建了一个Date对象.Date类型方法Date.parse():根据传入的参数返回毫秒数。参数为有固定格式的表示日期的字符串。Date.UTC():......
  • DP vs Non DP
    我们对知识的探究来源于探寻规律,而许多规律性的问题可以分出阶段进行递推解决,这样就形成了DP。DP非常有用,但它并不能取代找规律的过程。即使是多阶段决策问题,发现一些规律可能比直接使用DP更加简单。例子:你有\(n\)个字母A,\(m\)个字母B,你可以将这些字母组成成为一个字......
  • OpenCV笔记:cv2.VideoCapture 完成视频的跳帧输出操作
    前言 我开始关注这个问题,是在使用PaddleOCR+OpenCV进行视频文字识别的时候,因为OpenCV需要循环读取视频的每一帧进行解析,这就导致视频播放特别卡顿。由于视频中相邻帧的内容是一样的,重复识别也没有意义,所以我就在考虑:有没有办法跳帧输出?来源:https://blog.csdn.net/weixin_4425......
  • 天翼云加速落地紫金DPU实践应用,让算力供给更高效!
    近日,以“智驱创新·芯动未来”为主题的第三届DPU峰会在北京成功举办。会上,天翼云凭借紫金DPU在架构革新、算力释放、场景落地等多方面的成果,荣膺“2023芯星品牌奖”,技术实力与品牌影响力再获行业认可。天翼云科技有限公司基础架构事业部高/级产品经理雷晓龙在技术生态论坛发表了题......