博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法模版]斜率优化
阅读量:5263 次
发布时间:2019-06-14

本文共 1761 字,大约阅读时间需要 5 分钟。

[算法模版]斜率优化

在之前的博客中,有几道斜率优化的例题。但是那些例题都是把“状态”看作“线段”来处理的。最后我发现,还是把状态当成二维平面上的点比较好处理。

这里以昨天模拟赛的一道题作为例题来说一说斜率优化。

本文内容大部分由Harry_bh撰写,特此鸣谢。


\(Dp_{i,j}=Dp_{i-1,k}\)

\(dp_i=dp'_j+val(i-j)-(s_i-s_j)\)

假设 \(j\) 是最优决策点

假设 \(j<k\)

对于任意的 \(k\) 都满足

\[ dp_j+val(i-j)-(s_i-s_j)\leq dp_k+val(i-k)-(s_i-s_k)\\ dp_j-dp_k+s_j-s_k\leq val(j-k)\\ \cfrac{dp_j-dp_k+s_j-s_k}{j-k}\geq val\\ \]

这个东西他的意义就是 两个点 \((j,dp_j+s_j)\),\((k,dp_k+s_k)\) 所形成的直线的斜率

所以如果 \(j\)\(k\) 更优,那么这个斜率就满足。。。。

你维护一个队列,那么我们要使得队首元素就是我们想要的最优决策点,因为队首元素成立的条件是\(第一个点和第二个点的斜率\geq val\)。而\(val\)是单调递增的,所以我门需要让队列中每个点和上一个点的斜率是单调递增的(即下凸壳)。

我们在向队尾插入新的元素时,需要判断,如果\(tail,tail-1\)的斜率大于\(插入元素,tail-1\)的斜率时,就需要把\(tail\)删掉。(具体的意思就是\(tail\)的状态并没有优于插入元素,而在这个队列中的性质是每个队中状态要优于他后面的所有状态)

代码:

#include
#include
#include
#include
#include
#define ll long long#define maxn (int)(1e5+100)ll dp[1005][50020],dis[maxn],tim[50020],n,m,p,pre[maxn],h[maxn],t[maxn],queue[maxn];using namespace std;int main() { scanf("%lld%lld%lld",&n,&m,&p); for(int i=2;i<=n;i++){scanf("%lld",&dis[i]);dis[i]+=dis[i-1];} for(int i=1;i<=m;i++){scanf("%lld%lld",&h[i],&t[i]);tim[i]=t[i]-dis[h[i]];} sort(tim+1,tim+1+m);for(int i=1;i<=m;i++)pre[i]=tim[i]+pre[i-1]; memset(dp,0x3f,sizeof(dp));dp[0][0]=0; for(int i=1;i<=p;i++) { ll head=1,tail=0; for(int j=0;j<=m;j++) { while(head
tim[j]*(queue[head]-queue[head+1]))head++; dp[i][j]=dp[i-1][queue[head]]+tim[j]*(j-queue[head])-(pre[j]-pre[queue[head]]); while(head
(dp[i-1][queue[tail-1]]+pre[queue[tail-1]]-dp[i-1][j]-pre[j])*(queue[tail-1]-queue[tail]))tail--; queue[++tail]=j; } } printf("%lld",dp[p][m]);}

转载于:https://www.cnblogs.com/GavinZheng/p/11318982.html

你可能感兴趣的文章
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
hdu 2093
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
009.栈实现队列
查看>>
A-Softmax的总结及与L-Softmax的对比——SphereFace
查看>>
关于软件盘覆盖住布局
查看>>
Unity3D 控制物体移动、旋转、缩放
查看>>
UVa 11059 最大乘积
查看>>
UVa 12545 比特变换器
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
10个著名的思想实验1
查看>>
composer 报 zlib_decode(): data error
查看>>
linux下WPS的使用
查看>>
Web Api 利用 cors 实现跨域
查看>>
hdu 3938 并查集
查看>>