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股 且一次 ...
随机推荐
- How to enable/disable EWF
date: 2015/2/18 Enhanced Write Filter (or EWF) is a component of Windows XP Embedded and Windows Emb ...
- Hibernate中的多对多关系详解(3)
前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...
- BuzzSumo:什么样的文章能获得疯转?(基于1亿篇文章大数据分析)
BuzzSumo:什么样的文章能获得疯转?(基于1亿篇文章大数据分析) 社交媒体追踪服务分析工具BuzzSumo,2014年5月前后对社交媒体上超过1亿篇文章进行了分析,试图找出一个答案: 什么样的内 ...
- MacOS快捷键
- 防止 DDoS 攻击的五个「大招」!
提到 DDoS 攻击,很多人不会陌生.上周,美国当地时间 12 月 29 日,专用虚拟服务器提供商 Linode 遭到 DDoS 攻击,直接影响其 Web 服务器的访问,其中 API 调用和管理功能受 ...
- WINDOWS下简单操作SQLITE3
有测试操作的时候,还是很好的说~~~ 找个sqlite3.txt下载 sqlite3.exe db.sqlite3 SQLite version 3.7.13 2012-06-11 02:05:22 ...
- 【UVA10829】 L-Gap Substrings (后缀数组)
Description If a string is in the form UVU, where U is not empty, and V has exactly L characters, we ...
- Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good
/* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...
- URAL1079
Problem E Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/16384K (Java/Other) Total Sub ...
- winphone 开发学习笔记(2)
导航 NavigationService.Navigate(new Uri("xxxx.xaml",UriKind.Relative)) xxx表示要跳转的目标页面 页面和页面导航 ...