博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1233: [Usaco2009Open]干草堆tower 单调队列优化dp
阅读量:6088 次
发布时间:2019-06-20

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

又是一道单调队列优化dp的题目 这道题呢 先要了解一个结论,在多种可行的堆叠方案中,至少有一种能使层数最高的方案同时使得底边最短。即底边最短的,层数一定最高。 这个是zkw大神得出的 我也不会证明来着 反正这样之后我们就可以得出正确的方法了

递推式 F[i]=min(sum[j-1]-sum[i-1])  j>i 且 sum[j-1]-sum[i-1]>=F[j] 易得在满足的条件下j当然是越小越好了嘛 而这样得出的方程又满足一定的单调性 这样调整之后队首就是我们要的答案啦

又对于转移条件 f[j]<=sum[j1]sum[i1]f[j]<=sum[j−1]−sum[i−1] 我们把式子移项得到 sum[i1]<=sum[j1]f[j] 所以若k>j且sum【k-1】-f【k】>=sum【j-1】-f【j】那k一定不是最优解就可以舍弃啦

剩下的看看代码吧

#include
#include
#include
using namespace std;const int M=100007;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;} int f[M],g[M],sum[M],q[M],head,tail,n,w;int main(){ n=read(); for(int i=1;i<=n;i++) w=read(),sum[i]=sum[i-1]+w; q[0]=n+1; for(int i=n;i;i--){ while(head
=f[q[head+1]]) head++; f[i]=sum[q[head]-1]-sum[i-1]; g[i]=g[q[head]]+1; while(head
<=f[q[tail]]-sum[q[tail]-1]) tail--; q[++tail]=i; } printf("%d\n",g[1]); return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/6973460.html

你可能感兴趣的文章
微信调试类
查看>>
手机自动化测试:appium源码分析之bootstrap十一 1
查看>>
设计模式之适配器模式
查看>>
vim命令
查看>>
ls,cp(备份),mv等命令进阶
查看>>
极客技术专题【002期】:开发小技巧 - 如何使用jQuery来处理图片坏链?
查看>>
【安全牛学习笔记】MSsqlL注入取得网站路径最好的方法
查看>>
使用SseEmitter不断向网页输出结果
查看>>
基于UDP的效劳器端和客户端
查看>>
什么是线程安全?
查看>>
renderform 使用
查看>>
分区表 fstab
查看>>
四川大学本科教务系统 - 一键评教
查看>>
Python 之 模块初识
查看>>
最常用的酒店IPTV系统实施方案
查看>>
thinkphp if标签比较标签
查看>>
系统架构高可用系统设计原则01
查看>>
设计模式——适配器模式(adpter模式)
查看>>
shell实例手册
查看>>
df命令、du命令、磁盘分区
查看>>