决策单调性优化dp
四边形不等式
定义
若函数
也就是交叉小于包含
这是四边形不等式最基本的定义。但是在做题中我们常常遇到下面的一种形式.
推论
若函数
证明:
对于
对于
两式相加,得:
整理得:
以此类推,可得
同理对第二个数做这样的证明,即可得到
另外,如果函数
决策单调性
对于类似于
若有
并不是所有的动态规划问题都满足决策单调性,对于满足决策单调性的dp,我们可以采取一些方法来优化时间复杂度,以便快速获得答案。
四边形不等式与决策单调性
定理
设
当且仅当:
该规律可以通过打表验证
证明
移项,得
那么对于
于是,我们得到了证明一个dp方程满足决策单调性的方法:
证明(da biao xia cai)权函数
那么我们如何解决上面定理所描述的这一类问题呢?下面提供两种方法
二分法
使用一个栈来维护数据,栈内每个元素保存一个决策在当前最优决策表下的起始位置和终了位置,当插入一个新决策时,我们为了维护整个决策表的单调性,从后往前对于每一个老决策考虑以下两个步骤:
- 考虑老决策的起始位置上是否比新决策更劣,如果是,那么直接抛弃老决策,继续考虑下一个决策
- 如果老决策更优,那么在老决策的区间上二分分界点,然后让新决策入栈
由于一个决策最多只能进栈出栈一次,加上二分查找,时间复杂度是
分治法
当上面那个式子
设
时间复杂度
决策单调性与单调队列
如果
那么我们就一定可以找到一个一元函数
那么我们考虑下面的dp方程
设
有一个显然的性质是,如果
所以我们考虑用一个单调队列来维护决策表(包括决策和
- 队首元素不断出队,直到其处于
- 取出队首元素作为
的最优决策并把它计算出来 - 计算此时的
,并把这个决策丢到队尾,维护单调队列的单调性 - 重复上述步骤
时间复杂度
P3195 [HNOI2008]玩具装箱 (二分)
题目
P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。
P 教授有编号为
为了方便整理,P教授要求:
-
在一个一维容器中的玩具编号是连续的。
-
同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物。形式地说,如果将第
件玩具到第 个玩具放到一个容器中,那么容器的长度将为 。
制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为
题解
设
其中
证明左转洛谷题解区,实战中可以考虑使用打表来验证
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 50010
using namespace std;
ll n,L,l,r,mid,top,a[N],f[N],d[N],lt[N];
ll g(ll x, ll y)
{
return f[x]+(y-x-1+a[y]-a[x]-L)*(y-x-1+a[y]-a[x]-L);
}
ll find(ll x)
{
ll l=1,r=top;
while(l<r)
{
ll mid=(l+r+1)>>1;
if (x<lt[mid]) r=mid-1;
else l=mid;
}
return d[l];
}
int main()
{
scanf("%lld%lld",&n,&L);
for (ll i=1;i<=n; ++i)
{
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
lt[++top]=1;
d[top]=0;
for (ll i=1;i<=n;++i)
{
f[i]=g(find(i), i);
while(top && g(i,lt[top])<g(d[top],lt[top])) top--;
l=lt[top];
r=n;
while(l<r)
{
mid=(l+r)>>1;
if(g(i,mid)<g(d[top],mid)) r=mid;
else l=mid+1;
}
if(g(i,l)>g(d[top],l)) continue;
d[++top]=i;
lt[top]=l;
}
printf("%lld",f[n]);
return 0;
}
[USACO08MAR]Land Acquisition G (二分)
题目
Farmer John 准备扩大他的农场,眼前他正在考虑购买
如果 FJ 单买一块土地,价格就是土地的面积。但他可以选择并购一组土地,并购的价格为这些土地中最大的长乘以最大的宽。比如 FJ 并购一块
FJ 希望买下所有的土地。他发现,将这些土地分成不同的小组来并购可以节省经费。 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用。
题解
首先我们将土地按照长度排序,干掉一维,设
通过打表我们知道这玩意是不满足决策单调性的,但我们通过分析题目可以得知,如果一片大土地完全包含住了某一个小土地,那么那一片小土地就是没有意义的,我们将所有的这种小土地删掉,发现剩余的
因此我们可以将转移方程直接写成:
此时这个转移式是满足决策单调性的,可以直接通过上面的定理证明
ybtoj 金牌导航 征途 (分治+方差题意转化)
题目
给定一个长度为
题解
题目让我们求
化简可得
那么问题就转化成,将数列划分为
设
可以发现这个式子
代码如下:
void dp(int x,int l,int r,int L,int R)
{
int mid=l+r>>1,M=0;
f[x][mid]=inf;
for(int i=L;i<=R&&i<mid;i++)
{
int tmp=f[x-1][i]+(s[mid]-s[i])*(s[mid]-s[i]);
if(tmp<f[x][mid])
f[x][mid]=tmp,M=i;
}
if(l<mid)
dp(x,l,mid-1,L,M);
if(r>mid)
dp(x,mid+1,r,M,R);
}
POI2011 避雷针 Lightning Conductor (分治+不等式条件转化)
题目
气候变化使 Byteburg 不得不建造一个大型避雷针来保护城市里的所有建筑物。建筑物恰好沿一条街,从
建筑物的高度和避雷针的高度都是非负整数。Byteburg经费有限,只能建造一个避雷针。而且避雷针越高,价格越贵。
在建筑物
其中
Byteburg 需要你帮它计算,如果在第
题解
首先我们可以将题目中给的那个不等式转化为
绝对值通过分类讨论去掉,发现这个式子是具有决策单调性的,然后
P1912 [NOI2009] 诗人小G (二分+方案输出)
题目
小 G 是一个出色的诗人,经常作诗自娱自乐。但是,他一直被一件事情所困扰,那就是诗的排版问题。
一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的。小 G 给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远。显然排版时,不应改变原有的句子顺序,并且小 G 不允许把一个句子分在两行或者更多的行内。在满足上面两个条件的情况下,小 G 对于排版中的每行定义了一个不协调度, 为这行的实际长度与行标准长度差值绝对值的
小 G 最近又作了几首诗,现在请你对这首诗进行排版,使得排版后的诗尽量协调(即不协调度尽量小),并把排版的结果告诉他。
所有句子的长度不超过
题解
设
然后这个东西是有决策单调性的,打表猜测即可
方案输出只需要记住每一个状态的决策点就行了
时间复杂度
P4381 [IOI2008] Island (基环树+树形dp+单调队列优化)
题目
你准备浏览一个公园,该公园由
- 可以自行挑选一个岛开始游览。
- 任何一个岛都不能游览一次以上。
- 无论任何时间,你都可以由当前所在的岛
去另一个从未到过的岛 。从 到 有如下方法:- 步行:仅当两个岛之间有一座桥时才有可能。对于这种情况,桥的长度会累加到你步行的总距离中。
- 渡船:你可以选择这种方法,仅当没有任何桥和以前使用过的渡船的组合可以由
走到 (当检查是否可到达时,你应该考虑所有的路径,包括经过你曾游览过的那些岛)。
注意,你不必游览所有的岛,也可能无法走完所有的桥。
请你编写一个程序,给定
对于
保证每个岛都有桥与之相连
题解
首先,这道题是一个基环树森林,因此可以采用BFS的方法找到所有的连通分量,我们对每一个连通分量考虑,若无环,那么就是一个简单的树形dp;如果有环,那么我们先找到环,然后破环为链,设
转移方程如下:
由于
时间复杂度
posted on 2023-07-24 19:58 star_road_xyz 阅读(24) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】