首页 > 其他分享 >单调队列优化dp与斜率优化dp

单调队列优化dp与斜率优化dp

时间:2022-09-03 11:44:29浏览次数:78  
标签:队列 int 斜率 单调 x2 x1 优化 dp

单调队列优化dp是个相对比较不显然的优化。

例题:P2034 选择数字

题意:一串正整数,选择若干个数使和最大,且没有连续的超过k个数被选择。

首先显然是个dp题。方程也比较显然。设\(dp[i][1]\)为选择第i个数后最大值,
\(dp[i][0]\)为不选第\(i\)个数的最大值,\(s\)数组存前缀和。则方程也很显然:

\[dp[i][0]=\max(dp[i-1][0],dp[i-1][1]) \]

\[dp[i][1]=\max_{j=i-k}^i(dp[j][0]+s[i]-s[j]) \]

暴力枚举时间复杂度为\(O(n^2)\),1e5数据显然会超时。考虑优化。

使用单调队列可以快速排出过时决策。具体流程为:

  1. \(dp[i][0]\)赋初值,\(dp[i][1]=dp[i-1][0]+s[i]-s[j]\)。
  2. 如果队首元素与当前元素距离超过k则出队(排除过时决策)。
  3. 用队首元素更新\(dp[i][1]\)。
  4. 更新队尾。我们在一次计算中设原本的外层循环i为常量,j为变量,用单调队列维护j的值。由于这个dp方程中i与j不相关,我们就维护一个单调递减的队列,保存\(dp[j][0]-s[j]\)。
  5. 将i入队。

于是代码实现为:

l=1;
for(int i=1;i<=n;i++){
	dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
	dp[i][1]=dp[i-1][0]+s[i]-s[i-1];
	while(l<=r()&&q[l]<i-k)l++;
	if(l<=r)dp[i][1]=dp[q[l]][0]+s[i]-s[q[l]];
	while(l<=r&&dp[i][0]-s[i]>=dp[q[r]][0]-s[q[r]])r--;
	q[++r]=i;
}

接下来是斜率。还是例题:P3195 玩具装箱

一般这种题的方程大概都不会太难。这个题的方程也很显然:设\(dp[i]\)为到第i件物品的最小费用。于是:

\[dp[i]=\min^i_{j=0}(dp[j]+(s[i]+i-s[j]-j-l-1)^2) \]

可以看到这个式子是有同时出现i和j的项的。此时单调队列显然不可行。于是考虑斜率优化。把这个式子拆开,化成一个关于i,j的式子。其中,只有j的项为y,只有i的项为b,同时含有i,j的项中,i为k,j为x。这样我们便得到了一个一次函数。

对于外层循环的每个i,内部的k都会变化。我们需要的是大于等于此时k的第一个值。显然用单调队列维护。直接上代码:

inline int y(int x){return dp[x]+(s[x]+x)*(s[x]+x);}
inline int x(int a){return s[a]+a;}
inline int k(int x){return 2*(s[x]+x-len-1);}
inline double slope(int x1,int x2){return (y(x2)-y(x1))*1.0/(x(x2)-x(x1));}
inline int solve(int x1,int x2){int ss=x1-x2+s[x1]-s[x2]-len-1;return dp[x2]+ss*ss;}
for(int i=1;i<=n;i++){
	while(l<r&&slope(q[l],q[l+1])<k(i))l++;
	dp[i]=solve(i,q[l]);
	while(l<r&&slope(q[r-1],q[r])>=slope(q[r],i))r--;
	q[++r]=i;
}

可以看到,我们实际上维护的是一个下凸壳。另外注意一下,当k有正有负的时候,不能用单调队列,要用二分来查找最小值。还有的题是维护上凸壳。

标签:队列,int,斜率,单调,x2,x1,优化,dp
From: https://www.cnblogs.com/gtm1514/p/16652252.html

相关文章

  • WordPress的网站链接,如何去掉index.php和category?
    使用WordPress搭建网站时,如果你是基于IIS服务器搭建的,肯定会遇到这个问题,就是固定链接设置好后,网址会出现烦人的index.php和category这两个关键字。  举个例子,博客的分......
  • 【luogu P5056】【模板】插头dp(插头DP)(分类讨论)
    【模板】插头dp题目链接:luoguP5056题目大意有一个n*m的网格,每个格子要么必须铺线,要么必须不铺。然后问你有多少个铺发使得形成一个闭合回路。思路快乐插头DP模......
  • 送你 3 个优化大数据量下分页查询缓慢的锦囊妙计
    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方......
  • HTTPS 如何优化
    多角度优化HTTPS分析性能损耗产生性能消耗的两个环节:TLS协议握手过程;(TLS协议握手过程最长可以花费2RTT<mean:网络延时>)握手后的对称加密报文传输。解决方案:对......
  • 打开WordPress网站时,出现Http500错误怎么办?
    在用PHP+IIS+WordPress搭建博客系统时,我们最不想看到的就是报错,尤其是http500的错误,有时真是一头雾水,摸不到头脑。有时升级主题或插件,也会莫名其妙的报这个错误,对于没有编......
  • slam14(1) v3_2 后端优化 BA优化
    https://blog.csdn.net/moyu123456789/article/details/93718232    s     ......
  • WordPress美女图集COS写真整站自适应网站源码带完整数据
    这是自己做的网站,因为自己要做别的业务,没有时间打理,而且放着也是放着,不如拿来分享给大家,这个资源非常火爆,用来引流还是很轻松的。 网站从服务器备份了下来,所以有完整......
  • 数位dp
    数位dp简介数位\(dp\)是一种在数位上进行的\(dp\),通常用于解决值域\([L,R]\)中有几个数满足条件,且\([L,R]\)极大(如\(1\leL\leR\le1e18\))的问题,这时我们就......
  • 视频融合平台EasyCVR视频广场页脚优化为瀑布流式的实现方式
    EasyCVR基于云边端一体化架构,兼容性高、拓展性强,可支持多类型设备、多协议方式接入,将复杂多变的底层资源统一管理起来,实现视频资源的统一汇聚与管理、鉴权分发、服务器集群......
  • Ubuntu解决安装出错/usr/bin/dpkg returned an error code
    重装mysql后,安装任何软件都报错Readingpackagelists...DoneBuildingdependencytree...DoneReadingstateinformation...Donewgetisalreadythenewestvers......