博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2373 Dividing the Path (单调队列优化DP)题解
阅读量:5893 次
发布时间:2019-06-19

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

思路:

设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k。

初始状态为dp[0] = 0,注意喷水覆盖的范围是偶数且不重叠,所以插入队列的必是偶数。有牛的地方不能作为边界,所以这些地方都要排除,可以用vis标记或者其他方法。

代码:

#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const int N = 1000000+5;const int INF = 0x3f3f3f3f;using namespace std;int dp[N],q[N]; //单调递增队列:队首是当前dp最小的int main() { int n,l,a,b,L,R; scanf("%d%d%d%d",&n,&l,&a,&b); memset(dp,INF,sizeof(dp)); for(int i = 0;i < n;i++){ scanf("%d%d",&L,&R); for(int j = L + 1;j <= R - 1;j++){ dp[j] = INF + 1; } } int head = 0,tail = 0; dp[0] = 0; for(int i = 2*a;i <= l;i+= 2){ while(head < tail && dp[q[tail - 1]] >= dp[i - 2*a]) tail--; q[tail++] = i - 2*a; while(head < tail && q[head] < i - 2*b) head++; //i - 2*b <= j <= i - 2*a if(dp[i] <= INF) dp[i] = dp[q[head]] + 1; } if(dp[l] < INF) printf("%d\n",dp[l]); else printf("-1\n"); return 0;}

转载于:https://www.cnblogs.com/KirinSB/p/9408780.html

你可能感兴趣的文章
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
影响企业信息化成败的几点因素
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
struts中的xwork源码下载地址
查看>>
我的友情链接
查看>>
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
javascript继承方式详解
查看>>