【BZOJ1499】[NOI2005]瑰丽华尔兹

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

题解:先考虑向右滑的情况。用f[i][j][k]表示在第k段时间结尾,到达(i,j)位置时能滑行的最长距离,那么显然有。

$f[i][j][k]=max\{f[i][j'][k-1]+j-j'\} (j-t_k\le j' \le j且中间没有家具)$

显然可以用单调队列优化~

但是有四个方向怎么办~

写四遍~

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,x,y,K,h,t,ans;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
char str[210][210];
int f[210][210][210],last[210][210][4],q[210];
int main()
{
scanf("%d%d%d%d%d",&n,&m,&x,&y,&K);
int i,j,k,a,b,c,d;
for(i=1;i<=n;i++) scanf("%s",str[i]+1);
for(i=1;i<=n;i++) last[i][m+1][3]=m+1;
for(j=1;j<=m;j++) last[n+1][j][2]=n+1;
for(j=1;j<=m;j++) for(i=1;i<=n;i++) last[i][j][0]=(str[i][j]=='x')?i:last[i-1][j][0];
for(i=1;i<=n;i++) for(j=1;j<=m;j++) last[i][j][1]=(str[i][j]=='x')?j:last[i][j-1][1];
for(j=1;j<=m;j++) for(i=n;i>=1;i--) last[i][j][2]=(str[i][j]=='x')?i:last[i+1][j][2];
for(i=1;i<=n;i++) for(j=m;j>=1;j--) last[i][j][3]=(str[i][j]=='x')?j:last[i][j+1][3];
memset(f,0x80,sizeof(f));
f[x][y][0]=0;
for(k=1;k<=K;k++)
{
scanf("%d%d%d",&a,&b,&d),c=b-a+1;
if(d==4) for(i=1;i<=n;i++) for(h=1,t=0,j=1;j<=m;j++)
{
while(h<=t&&f[i][q[t]][k-1]-q[t]<f[i][j][k-1]-j) t--;
q[++t]=j;
while(h<=t&&(j-q[h]>c||q[h]<=last[i][j][1])) h++;
if(str[i][j]=='.') f[i][j][k]=max(f[i][j][k-1],f[i][q[h]][k-1]+j-q[h]);
}
if(d==2) for(j=1;j<=m;j++) for(h=1,t=0,i=1;i<=n;i++)
{
while(h<=t&&f[q[t]][j][k-1]-q[t]<f[i][j][k-1]-i) t--;
q[++t]=i;
while(h<=t&&(i-q[h]>c||q[h]<=last[i][j][0])) h++;
if(str[i][j]=='.') f[i][j][k]=max(f[i][j][k-1],f[q[h]][j][k-1]+i-q[h]);
}
if(d==3) for(i=1;i<=n;i++) for(h=1,t=0,j=m;j>=1;j--)
{
while(h<=t&&f[i][q[t]][k-1]+q[t]<f[i][j][k-1]+j) t--;
q[++t]=j;
while(h<=t&&(q[h]-j>c||q[h]>=last[i][j][3])) h++;
if(str[i][j]=='.') f[i][j][k]=max(f[i][j][k-1],f[i][q[h]][k-1]+q[h]-j);
}
if(d==1) for(j=1;j<=m;j++) for(h=1,t=0,i=n;i>=1;i--)
{
while(h<=t&&f[q[t]][j][k-1]+q[t]<f[i][j][k-1]+i) t--;
q[++t]=i;
while(h<=t&&(q[h]-i>c||q[h]>=last[i][j][2])) h++;
if(str[i][j]=='.') f[i][j][k]=max(f[i][j][k-1],f[q[h]][j][k-1]+q[h]-i);
}
}
for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(str[i][j]=='.') ans=max(ans,f[i][j][K]);
printf("%d",ans);
return 0;
}

【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP的更多相关文章

  1. bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status ...

  2. bzoj1499 [NOI2005]瑰丽华尔兹——单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y ...

  3. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  4. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  5. BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列

    题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...

  6. [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1714  Solved: 1042[Submit][Status ...

  7. BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)

    Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...

  8. BZOJ1499 [NOI2005]瑰丽华尔兹 【单调队列优化dp】

    题目 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫 ...

  9. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

随机推荐

  1. LeetCode OJ-- Jump Game II **

    https://oj.leetcode.com/problems/jump-game-ii/ 给一个数列,每次可以跳相应位置上的步数,问跳到最后位置至少用几步. 动态规划: j[pos]表示从0到po ...

  2. nodejs Centos环境搭建

    使用二进制文件安装: node 环境下载 https://nodejs.org/en/download/ 下载里面的windows 安装包 和 linux 安装包 1)windows安装 window ...

  3. App Store 审核指南(最新)

    简介 App 正在改变世界,丰富人们的生活,并为像您一样的开发者提供前所未有的创新机会.因此,App Store 已成长为一个激动人心且充满活力的生态系统,正为数百万的开发者和超过十亿的用户提供服务. ...

  4. 常用的Linux系统命令

    一.linux简介                                                                                            ...

  5. Kali Linux 2017.1脚本gerix.py修复

    Kali Linux 2017.1脚本gerix.py修复   Gerix是一款优秀的图形界面的无线渗透工具.从Kali Linux 2016.2开始,该工具在Kali Linux中运行就存在一些问题 ...

  6. 盘点支持Orchard的.NET 4.5虚拟主机(虚拟空间)

    Orchard作为.NET社区最为先进的开源项目之一,已经被越来越多的人使用, 由于它使用了最时髦的微软技术栈(.NET4.5),因此在 Win2008+和IIS7+ 的环境上运行最为完美, 而win ...

  7. lock与monitor的区别

    1.Lock 只能对引用对象加锁 Lock锁定区间内可以对锁定值修改而不发生运行时错误,通常也会采用此种修改方式.这种方式又有点类同于使用Monitor.Wait取得资源,并对这个资源进行操作. 用法 ...

  8. Web编程前端之7:web.config详解 【转】

    http://www.cnblogs.com/alvinyue/archive/2013/05/06/3063008.html 声明:这篇文章是摘抄周公(周金桥)的<asp.net夜话> ...

  9. NV 3D投影方案 【转】

    http://tu.pcpop.com/all-677013.htm 1/8 NVIDIA 3D方案涉及图形处理器(GPU).信号发射器.快门式3D眼镜.3D播放软件以及经过NVIDIA认证的显示器. ...

  10. 每天5道面试题(二)java基础

    说出Servlet的生命周期,并说出Servlet和CGI的差别 Servlet被server实例化后,容器执行其init方法,请求到达时执行其service方法,service方法自己主动派遣执行与 ...