poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110
#define maxm 16010
using namespace std;
int n,m,f[maxn][maxm],ans;
struct node{
int l,s,p;
bool operator < (const node &x) const {
return s<x.s;
}
}a[maxn];
int max(int x,int y){
return x>y?x:y;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++)
scanf("%d%d%d",&a[i].l,&a[i].p,&a[i].s);
memset(f,,sizeof(f));ans=;
sort(a+,a++m);//排序s为关键字
for(int i=;i<=m;i++){//状态表示 前i个人 干到j这里 的最优值
int x=min(n,a[i].s+a[i].l-);//i最多干到哪
for(int j=;j<=n;j++){
f[i][j]=max(f[i][j-],f[i-][j]);//i不干j 可以是j-1的状态 也可以是上一个人干到j的状态
if(j<a[i].s||j>x)continue;//i必须停在这个范围里 也就是状态在这个范围
for(int k=;k<a[i].s;k++){//上一个人 i-1 他不能把i的起点覆盖了 否则i就走不了了
if(j-k>a[i].l)continue;//i要把k-j的都盖了 长度有限制
f[i][j]=max(f[i][j],f[i-][k]+(j-k)*a[i].p);
}
ans=max(ans,f[i][j]);
}
}
printf("%d\n",ans);
} return ;
}
/*
poj 1821 单调队列优化
wa到挺了.....
一开始队列指针写错了...
好吧平时用STL最近手打在改习惯改乱了.
开始一直混乱着
不知道怎么保证队列里存的是i-1的状态而不是i的
根据方程的含义来看 上次不能盖了这次的s 这次还至少到s
正好分开了 多以存的时候分开
第一个for是存i-1的状态
后一个是更新i
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110
#define maxm 16010
using namespace std;
int n,m,f[maxn][maxm],ans;
int q[maxm],head,tail;
struct node{
int l,s,p;
bool operator < (const node &x) const {
return s<x.s;
}
}a[maxn];
int max(int x,int y){
return x>y?x:y;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++)
scanf("%d%d%d",&a[i].l,&a[i].p,&a[i].s);
memset(f,,sizeof(f));ans=;
sort(a+,a++m);
for(int i=;i<=m;i++){
head=;tail=;
for(int j=;j<=n;j++)
f[i][j]=max(f[i-][j],f[i][j-]);
int L=max(,a[i].s-a[i].l);
int R=min(n,a[i].s+a[i].l-);
for(int j=L;j<a[i].s;j++){
int x=f[i-][j]-j*a[i].p;
while(head<=tail&&f[i-][q[tail]]-q[tail]*a[i].p<x)tail--;
q[++tail]=j;
}
for(int j=a[i].s;j<=R;j++){
while(head<=tail&&j-q[head]>a[i].l)head++;
int y=q[head];
f[i][j]=max(f[i][j],f[i-][y]+(j-y)*a[i].p);//这里要取大
ans=max(ans,f[i][j]);
}
}
printf("%d\n",ans);
}
return ;
}
poj 1821 Fence 单调队列优化dp的更多相关文章
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- $Poj1821\ Fence\ $单调队列优化$DP$
Poj Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- poj1821 Fence(单调队列优化dp)
地址 一排N个木板,M个工匠站在不同位置$S_i$,每个人可以粉刷覆盖他位置的.最长长度为$L_i$木板段,每刷一个有$P_i$报酬.同一木板只刷一次.求最大报酬. 根据每个人的位置dp,设$f[i] ...
- 单调队列优化DP——习题收集
前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
随机推荐
- 对比JQuery与JavaScript
JavaScript 是一种脚本语言,主要用在浏览器中,实现对网页的文档对象的操作和一些用户交互动作的处理.而 jQuery 则是 JavaScript 的一个代码库(或习惯性叫类库),它将一些在 J ...
- bzoj 3632: 外太空旅行 最大团
3632: 外太空旅行 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 389 Solved: 129[Submit][Status] Descript ...
- Hibernate 注解 字段不映射的注解
在字段前面加这个注解:@Transient
- windows驱动开发推荐书籍
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
- lc面试准备:Invert Binary Tree
1 题目 Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 接口: public TreeNod ...
- 14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚
14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚 InnoDB 自动检测事务死锁和回滚一个事务 InnoDB 尝试挑选小的事务来回滚,事务 ...
- Linux 关机命令 重启命令
Linux centos重启命令: 1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用)4.shut ...
- YUV像素和ycbcr
一幅彩色图像的基本要素是什么? 说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少.一幅1920x1080像素的YUV422的图像,大小是1920X1080X2=4147 ...
- OpenStack学习推荐
前言: 学习.了解.安装部署OpenStack也写了好一段时间了,现在觉得也有点必要写点总结.搞IT这一块基本就这样,不管是搞什么领域,一个项目超过两个月没动它,就基本不知道当时是怎么搞的,当时学 ...
- 《University Calculus》-chaper13-多重积分-二重积分的计算
之前关于二重积分的笔记,介绍了二重积分概念的引入,但是对于它的计算方法(化为累次积分),介绍的较为模糊,它在<概率论基础教程>中一系列的推导中发挥着很重要的作用. 回想先前关于二重积分的几 ...