P2627 [USACO11OPEN]Mowing the Lawn G(单调队列优化dp)
发布日期:2021-06-30 10:32:41
浏览次数:2
分类:技术文章
本文共 946 字,大约阅读时间需要 3 分钟。
定义 f [ i ] f[i] f[i]表示前 i i i头奶牛不选第 i i i头奶牛的最大收益
那么 f [ i ] = max { f [ j ] + s u m i − 1 − s u m j } f[i]=\max\{f[j]+sum_{i-1}-sum_{j}\} f[i]=max{ f[j]+sumi−1−sumj}
其中 j ∈ [ i − k − 2 , i − 1 ] j\in[i-k-2,i-1] j∈[i−k−2,i−1]
发现 s u m i − 1 sum_{i-1} sumi−1固定,求的是 f [ j ] − s u m j f[j]-sum_j f[j]−sumj的最小值
这个可以用线段树处理,但是没有必要
求最小值只需要维护一段区间长度为 k + 1 k+1 k+1的单调队列即可
#includeusing namespace std;#define int long longconst int maxn = 1e6+10;int f[maxn],sum[maxn],n,k,e[maxn];int head = 1, tail = 0, q[maxn];//单调队列 signed main(){ cin >> n >> k; for(int i=1;i<=n;i++) scanf("%lld",&e[i] ); for(int i=1;i<=n+1;i++) sum[i] = sum[i-1]+e[i] ; q[++tail] = 0; //f[i]可以从距离自己距离0,1,2,3,4,5,6,7,8,9.....k的位置转移而来 for(int i=1;i<=n+1;i++) { while( q[tail]-q[head]+1>k+1 ) head++; int las = q[head]; f[i] = f[las]-sum[las]+sum[i-1]; while( tail>=head && f[i]-sum[i]>=f[q[tail]]-sum[q[tail]] ) tail--; q[++tail] = i; } printf("%lld",f[n+1] ); }
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/116258010 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月13日 08时37分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
QT之旅——post 文件
2019-04-30
树莓派为连接不同Wifi分配固定IP的方法
2019-04-30
[转]Linux 下编译、安装、配置 QT
2019-04-30
新手教学看eMule 0.50a Xtreme 8.0设置
2019-04-30
如何在Linux使用Eclipse + CDT开发C/C++程序?
2019-04-30
Eclipse官网下载页面的Packages 和Developer Builds区别
2019-04-30
在CentOS 6.4安装Qt5.0.1
2019-04-30
深入浅出TCP之send和recv
2019-04-30
yum和apt-get的区别
2019-04-30
vim中文帮助的安装
2019-04-30
linux下获取所有文件夹和文件,支持nfs和xfs
2019-04-30
用分区魔术师把linux所占的分区删除后重写mbr
2019-04-30
软件架构师书籍
2019-04-30
Java程序员到架构师的推荐阅读书籍
2019-04-30
LFS、BLFS、ALFS、HLFS的区别
2019-04-30
国外知名网站评出对程序员最具影响力的图书(附下载)
2019-04-30
敏捷开发与极限编程
2019-04-30
如何获取system()函数的pid
2019-04-30
iconv 文件编码转换
2019-04-30
QLineEdit设置ip输入规则
2019-04-30