单调队列优化动态规划.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单调队列优化动态规划

关键片段: t:=1;w:=0; for i:=1 to n do ??begin ??while (t=w) and (c[i]-c[b[t]]m) do inc(t); ??while (t=w) and (f[i-1]f[b[w]]) do dec(w); ??w:=w+1; ??b[w]:=i-1; ??f[i]:=f[b[t]]+a[i]; ??end; max:=maxlongint; for i:=n-m+1 to n do ??if f[i]max then max:=f[i]; writeln(max); var st:ansistring; ????l,n,i,p,t,w:longint; ????f:boolean; ????a,q:Array[0..5000010] of longint; begin ??readln(st); ??l:=length(st); ??readln(n); ??for i:=1 to l do ???a[i]:=ord(st[i])-48; ??q[0]:=-1; ??p:=maxlongint; ??for i:=1 to l do ???begin ????if n=0 then ?????begin ??????p:=i; ??????break; ?????end; ??? ?while (t=w) and (n0) and (a[i]q[w]) do ?????begin ??????dec(w); ??????dec(n); ?????end; ????inc(w); ????q[w]:=a[i]; ???end; ??while n0 do ???begin ????dec(w); ????dec(n); ???end; ??inc(t); ??f:=false; ??while t=w do ???begin ????if f or (q[t]0) then ?????begin ??????f:=true; ??????write(q[t]); ?????end; ????inc(t); ???end; ??for i:=p to l do ???if f or (a[i]0) then ????begin ?????f:=true; ?????write(a[i]); ????end; end. * * 单调队列优化动态规划 可用单调队列优化的动规有一大类题型,它们多半都有一个特征:可以化归为序列中定长区间的最值问题。注意这里必须是定长区间,否则应用RMQ算法。下面举一个例子: ?输入:第一行两个正整数N(N=600000),M。接下来一行N个数。 ??输出:对于每个区间[i,i-M+1],输出其中的最小值。 思路:很显然这道题数据大到不允许利用RMQ的各种O(NlogN)的算法,想到每一次找最小值都只是将上一个区间后移一个数,即这个区间的答案很有可能可从上个区间获得,于是保持一个单调队列,区间每后移一次,就将num[i]插入队尾,若队尾的数Q[k]大于等于当前的数(num[i]),就说明Q[k]在以后就不可能是一个可行解,删去它,这样循环操作,直至Q[k]num[i]为止。 对于每一个区间的最小值,只需输出当前队最前面的且在num中的下标号大于i-M+1的值即可。这样复杂度就从O(NlogN)飞跃到了O(N)。 ??此外,有很多问题可以化归为此问题进行解决,如求序列中长度不大于定值的最大连续子序列和等问题,并且此方法可以套用于满足上述性质的非动归题目,应用范围极广。 poj2373 有一个长度为L(1000000)的区间,L是偶数,喷水的机器半径是a到b,限制:1区间不能重复覆盖,2部分区域一定只能被一个机器覆盖。 求最少需要多少机器。 f[i]表示长度为i的最少需要几个设备。 f[i]=1+min(f[i-2a]..f[i-2b]); 把f[i-2*a]到f[i-2*b]看成一个滑动窗口,维护一个从小到大的队列,左边可以出去,右边也可以出去,右边出去的条件是当前新加入的数小于等于队尾,就可以把队尾删除 同时注意,由于某些区域只能由一个设备覆盖,所以对于[s,t]的这种区域,我们对于所有的sit,都让f[i]=无穷大+1; 而且只有当i是偶数的时候,f[i]才有解。 q数组里面记录的是下标 最大子序和 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输入 第一行两个数n,m 第二行有n个数,要求在n个数找到最大子序和 输出格式 一个数,数出他们的最大子序和 输入 6 4 1 -3

文档评论(0)

zhaoxiaoj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档