【[NOI2005]瑰丽华尔兹】
非常无脑和码农的单调队列优化\(dp\)
我们发现一个时间段内移动的情况是一样的,而时间段的数目又非常少,所以可以直接按照时间段来进行\(dp\)
由于每一次\(dp\)的移动距离都是小于等于某一个固定值的,于是可以直接上单调队列优化
复杂度\(O(nmk)\)
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 205
#define max(a,b) ((a)>(b)?(a):(b))
int dp[maxn][maxn],now[maxn][maxn];
int n,m,sx,sy,K;
int S,E,wind;
char map[maxn][maxn];
int h,t,q[maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int main()
{
n=read(),m=read(),sx=read(),sy=read(),K=read();
for(re int i=1;i<=n;i++) scanf("%s",map[i]+1);
memset(dp,-20,sizeof(dp)),memset(now,-20,sizeof(now));
now[sx][sy]=dp[sx][sy]=0;
for(re int O=1;O<=K;O++)
{
S=read(),E=read(),wind=read();
int T=E-S+1;
memset(now,-20,sizeof(now));
if(wind==4)
{
for(re int i=1;i<=n;i++)
{
h=1,t=0;
memset(q,0,sizeof(q));
for(re int j=2;j<=m;j++)
{
while(h<=t&&dp[i][q[t]]-q[t]<dp[i][j-1]-j+1) t--;
q[++t]=j-1;
if(map[i][j-1]=='x') while(h<=t) h++;
if(map[i][j]=='x') continue;
while(h<=t&&q[h]+T<j) h++;
if(h<=t) now[i][j]=max(dp[i][j],j+dp[i][q[h]]-q[h]);
}
}
}
if(wind==3)
{
for(re int i=1;i<=n;i++)
{
h=1,t=0;
memset(q,0,sizeof(q));
for(re int j=m-1;j>=1;j--)
{
while(h<=t&&dp[i][q[t]]+q[t]<dp[i][j+1]+j+1) t--;
q[++t]=j+1;
if(map[i][j+1]=='x') while(h<=t) h++;
if(map[i][j]=='x') continue;
while(h<=t&&j+T<q[h]) h++;
if(h<=t) now[i][j]=max(dp[i][j],dp[i][q[h]]+q[h]-j);
}
}
}
if(wind==2)
{
for(re int j=1;j<=m;j++)
{
h=1,t=0;
memset(q,0,sizeof(q));
for(re int i=2;i<=n;i++)
{
while(h<=t&&dp[q[t]][j]-q[t]<dp[i-1][j]-i+1) t--;
q[++t]=i-1;
if(map[i-1][j]=='x') while(h<=t) h++;
if(map[i][j]=='x') continue;
while(h<=t&&q[h]+T<i) h++;
if(h<=t) now[i][j]=max(dp[i][j],i+dp[q[h]][j]-q[h]);
}
}
}
if(wind==1)
{
for(re int j=1;j<=m;j++)
{
h=1,t=0;
for(re int i=n-1;i>=1;i--)
{
while(h<=t&&dp[q[t]][j]+q[t]<dp[i+1][j]+i+1) t--;
q[++t]=i+1;
if(map[i+1][j]=='x') while(h<=t) h++;
if(map[i][j]=='x') continue;
while(h<=t&&i+T<q[h]) h++;
if(h<=t) now[i][j]=max(dp[i][j],dp[q[h]][j]+q[h]-i);
}
}
}
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
dp[i][j]=max(dp[i][j],now[i][j]);
}
int ans=0;
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
ans=max(ans,dp[i][j]);
std::cout<<ans;
return 0;
}
【[NOI2005]瑰丽华尔兹】的更多相关文章
- NOI2005瑰丽华尔兹
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- luogu P2254 [NOI2005]瑰丽华尔兹
题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...
- 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...
- [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1714 Solved: 1042[Submit][Status ...
- 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
- P2254 [NOI2005]瑰丽华尔兹
链接P2254 [NOI2005]瑰丽华尔兹 首先有个很朴素的\(dp\),设\(f_{i,j,k}\)表示\(k\)时刻地点\(i,j\)的最长长度. 然后这样不能优化,考虑利用一段连续时间是同一个 ...
- 题解-[NOI2005]瑰丽华尔兹
题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)
Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...
随机推荐
- MySQL---4、语句规范
1.命名规范 (1)库名.表名.(按现在的规范类似; PromoHayaoRecord),数据库名使用小写,字段名必须使用小写字母,并采用下划线分割.关键字与函数名称全部大写.(2)库名.表名.字段名 ...
- DWF Toolkit on Microsoft Windows
If you are statically linking on Windows, you need these preprocessor defines: DWFTK_STATIC DWFTK_BU ...
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
- uestc 1072 a ^ b
a ^ b Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 334 Tried: 2153 Description 求a的b次方后四位. In ...
- Window ssh免密登录到远程Linux服务器
SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统. 1. 基于口令的安全验证 这种方式使用用户名密码进行联机登录,一般情况下我们使用的都是这种方式.整个过程大致如下: (1)客户端发起连 ...
- 洛谷 P2469 [SDOI2010]星际竞速 解题报告
题目描述 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一. 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其 ...
- grep用法详解:grep与正则表达式
首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.awk .sed 都支 ...
- C#中Equals和= =(等于号)的比较(转)
一. 值类型的比较 对于值类型来说 两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的. 例: int i = 9; int j = 9; Console ...
- Sql Server增加Sequence序列语句
1.创建序列 下面的示例创建名为 DecSeq 使用一个序列 十进制 具有介于 0 到 255 之间的数据类型.序列以 125 开始,每次生成数字时递增 25. 因为该序列配置为可循环,所以,当值超过 ...
- Oracle之表空间
Oracle数据库被划分为称作表空间的逻辑区域,形成Oracle数据库的逻辑结构.一个Oracle数据库对应一个或多个表空间,而一个表空间对应一个或多个物理的数据库文件.表空间是Oracle数据库回复 ...