设d[p][i][j]为第p时间段末在(i,j)时已滑行的最长距离

以向下滑为例

d[p][i][j]=max{d[p-1][i-k][j]+k}=max{d[p-1][k][j]-j}+i

然后就是个沙雕单调队列优化DP

/***        ┏┓    ┏┓*        ┏┛┗━━━━━━━┛┗━━━┓*        ┃       ┃  *        ┃   ━    ┃*        ┃ >   < ┃*        ┃       ┃*        ┃... ⌒ ...  ┃*        ┃       ┃*        ┗━┓   ┏━┛*          ┃   ┃ Code is far away from bug with the animal protecting          *          ┃   ┃   神兽保佑,代码无bug*          ┃   ┃           *          ┃   ┃        *          ┃   ┃*          ┃   ┃           *          ┃   ┗━━━┓*          ┃       ┣┓*          ┃       ┏┛*          ┗┓┓┏━┳┓┏┛*           ┃┫┫ ┃┫┫*           ┗┻┛ ┗┻┛*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<bitset>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define eps 1e-8
#define succ(x) (1LL<<(x))
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define mid (x+y>>1)
#define NM 205
#define nm 200005
#define pi 3.1415926535897931
using namespace std;
const ll inf=1e9+7;
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}int n,m,_x,_y,_t,tot,d[NM][NM][NM],ans,q[NM],qh,qt;
bool a[NM][NM];
char _s[NM];int main(){//freopen("data.in","r",stdin);n=read();m=read();_x=read();_y=read();tot=read();inc(i,1,n){scanf("%s",_s+1);inc(j,1,m)if(_s[j]=='x')a[i][j]=1;}inc(i,1,n)inc(j,1,m)d[0][i][j]=-inf;d[0][_x][_y]=0;inc(p,1,tot){_x=read();_y=read();_t=read();_x=_y-_x+1;if(_t==3){inc(i,1,n){qh=1;qt=0;dec(j,m,1){d[p][i][j]=d[p-1][i][j];if(a[i][j])qt=qh-1;else{while(qh<=qt&&q[qh]-j>_x)qh++;if(qh<=qt)d[p][i][j]=max(d[p][i][j],d[p-1][i][q[qh]]+q[qh]-j);while(qh<=qt&&d[p-1][i][j]+j>=d[p-1][i][q[qt]]+q[qt])qt--;q[++qt]=j;}}}}else if(_t==4){inc(i,1,n){qh=1;qt=0;inc(j,1,m){d[p][i][j]=d[p-1][i][j];if(a[i][j])qt=qh-1;else{while(qh<=qt&&j-q[qh]>_x)qh++;if(qh<=qt)d[p][i][j]=max(d[p][i][j],d[p-1][i][q[qh]]+j-q[qh]);while(qh<=qt&&d[p-1][i][j]-j>=d[p-1][i][q[qt]]-q[qt])qt--;q[++qt]=j;}}}}else if(_t==1){inc(j,1,m){qh=1;qt=0;dec(i,n,1){d[p][i][j]=d[p-1][i][j];if(a[i][j])qt=qh-1;else{while(qh<=qt&&q[qh]-i>_x)qh++;if(qh<=qt)d[p][i][j]=max(d[p][i][j],d[p-1][q[qh]][j]+q[qh]-i);while(qh<=qt&&d[p-1][i][j]+i>=d[p-1][q[qt]][j]+q[qt])qt--;q[++qt]=i;}}}}else{inc(j,1,m){qh=1;qt=0;inc(i,1,n){d[p][i][j]=d[p-1][i][j];if(a[i][j])qt=qh-1;else{while(qh<=qt&&i-q[qh]>_x)qh++;if(qh<=qt)d[p][i][j]=max(d[p][i][j],d[p-1][q[qh]][j]+i-q[qh]);while(qh<=qt&&d[p-1][i][j]-i>=d[p-1][q[qt]][j]-q[qt])qt--;q[++qt]=i;}}}}}//inc(p,1,tot){inc(i,1,n){inc(j,1,m)printf("%d ",d[p][i][j]);putchar('\n');}putchar('\n');}inc(i,1,n)inc(j,1,m)ans=max(ans,d[tot][i][j]);return 0*printf("%d\n",ans);
}

1499: [NOI2005]瑰丽华尔兹

Time Limit: 3 Sec  Memory Limit: 64 MB
Submit: 2148  Solved: 1304
[Submit][Status][Discuss]

Description

你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐。但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900。 1900在20世纪的第一年出生在往返于欧美的邮轮弗吉尼亚号上,很不幸他刚出生就被抛弃了,成了孤儿。1900孤独的成长在弗吉尼亚号上,从未离开过这个摇晃的世界。也许是对他命运的补偿,上帝派可爱的小天使艾米丽照顾他。可能是天使的点化,1900拥有不可思议的钢琴天赋:从未有人教,从没看过乐谱,但他却能凭着自己的感觉弹出最沁人心脾的旋律。当1900的音乐获得邮轮上所有人的欢迎时,他才8岁,而此时的他已经乘着海轮往返欧美大陆50余次了。虽说是钢琴奇才,但1900还是个孩子,他有着和一般男孩一样的好奇和调皮,只不过更多一层浪漫的色彩罢了:这是一个风雨交加的夜晚,海风卷起层层巨浪拍打着弗吉尼亚号,邮轮随着巨浪剧烈的摇摆。船上的新萨克斯手马克斯•托尼晕船了,1900招呼托尼和他一起坐上舞厅里的钢琴,然后松开了固定钢琴的闸,于是,钢琴随着海轮的倾斜滑动起来。准确的说,我们的主角1900、钢琴、邮轮随着1900的旋律一起跳起了华尔兹,随着“嘣嚓嚓”的节奏,托尼的晕船症也奇迹般的消失了。后来托尼在回忆录上写道:大海摇晃着我们使我们转来转去快速的掠过灯和家具我意识到我们正在和大海一起跳舞真是完美而疯狂的舞者晚上在金色的地板上快乐的跳着华尔兹是不是很惬意呢?也许,我们忘记了一个人,那就是艾米丽,她可没闲着:她必须在适当的时候施展魔法帮助1900,不让钢琴碰上舞厅里的家具。不妨认为舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地。钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长。每个时刻,钢琴都会随着船体倾斜的方向向相邻的方格滑动一格,相邻的方格可以是向东、向西、向南或向北的。而艾米丽可以选择施魔法或不施魔法:如果不施魔法,则钢琴会滑动;如果施魔法,则钢琴会原地不动。艾米丽是个天使,她知道每段时间的船体的倾斜情况。她想使钢琴在舞厅里滑行路程尽量长,这样1900会非常高兴,同时也有利于治疗托尼的晕船。但艾米丽还太小,不会算,所以希望你能帮助她。

Input

输入文件的第一行包含5个数N, M, x, y和K。N和M描述舞厅的大小,x和y为钢琴的初始位置(x行y列);我们对船体倾斜情况是按时间的区间来描述的,且从1开始计量时间,比如“在[1, 3]时间里向东倾斜,[4, 5]时间里向北倾斜”,因此这里的K表示区间的数目。以下N行,每行M个字符,描述舞厅里的家具。第i行第j列的字符若为‘ . ’,则表示该位置是空地;若为‘ x ’,则表示有家具。以下K行,顺序描述K个时间区间,格式为:si ti di。表示在时间区间[si, ti]内,船体都是向di方向倾斜的。di为1, 2, 3, 4中的一个,依次表示北、南、西、东(分别对应矩阵中的上、下、左、右)。输入保证区间是连续的,即 s1 = 1 si = ti-1 + 1 (1 < i ≤ K) tK = T

Output

输出文件仅有1行,包含一个整数,表示钢琴滑行的最长距离(即格子数)。

Sample Input

4 5 4 1 3
..xx.
.....
...x.
.....
1 3 4
4 5 1
6 7 3

Sample Output

6

HINT

Source

鸣谢刘汝佳先生授权使用

[Submit][Status][Discuss]

bzoj1499(DP+单调队列)相关推荐

  1. URAL 1427. SMS(DP+单调队列)

    题目链接 我用的比较传统的办法...单调队列优化了一下,写的有点搓,不管怎样过了...两个单调队列,存两个东西,预处理一个标记数组存... 1 #include <iostream> 2 ...

  2. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  3. 烽火传递(dp+单调队列)

    烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一 ...

  4. [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

    首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...

  5. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  6. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

  7. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

  8. Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)

    题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...

  9. bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)

    真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的. 设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度.枚举上一个线段 ...

  10. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

最新文章

  1. 金华杭州计算机学校录取分数线,2017年浙江金华各地中考录取分数线
  2. python编程做什么工作-学习Python编程后在成都可以做哪些工作?
  3. Intel VT学习笔记(五)—— 调试技巧
  4. java word 加密_如何通过Java实现加密、解密Word文档
  5. QT的QMutableLinkedListIterator类的使用
  6. Effective Java之注解优于命名模式(三十五)
  7. hadoop练习处理地震数据
  8. 软件测试工具LoadRunner中如何定义SLA?--转载
  9. HDU - 6982 J - Road Discount wqs二分 + 模型转换 + 优化
  10. 索要ValidateTextBox控件Source Code的朋友rickel****@gmail.com,邮件退回了。各位,与我通信,请不要使用GMAIL,烦。...
  11. 【损失函数】常见的损失函数(loss function)总结
  12. Java使用ffmpeg将视频转为Mp4格式
  13. 频谱泄漏(spectral leakage)
  14. 串联两个路由器共享宽带上网
  15. python画venn图
  16. 基于PLC等控制伺服3点坐标系计算
  17. java SWT:MouseEvent,KeyEvent中stateMask字段的用法
  18. 能把百度玩出花样的人肯定不简单,分享几个鲜为人知的搜索引擎高级语法
  19. Latch及latch冲突
  20. 智慧城市挺进“绿色”时代

热门文章

  1. 怎么把dicom数据转成nifty数据
  2. c语言编译器中输出虚线,请教:c语言中用什么命令画虚线
  3. PHPUnit 在线中文手册
  4. java微信分享朋友圈_Java实现微信公众平台朋友圈分享功能详细代码
  5. python msproject_MS Project(*.mpp文件)到PowerBi
  6. matlab求合同矩阵,matlab-线性代数 判断 合同矩阵
  7. 如何使用纯CSS将页面转换为繁体字
  8. Mac卸载Pandoc
  9. 苹果6p计算机在哪里设置方法,苹果手机怎么设置铃声【图文教程,不用电脑,1分钟完成】...
  10. 使用谷歌(Google)TTS服务 – Java版开源gTTS及Python gTTS