【[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 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...
随机推荐
- C#RabbitMQ基础学习笔记
RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...
- Vue 多路由文件的合并
Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...
- CXF开发WebService
CXF开发Web Service 参考链接 使用 spring 框架来集成 Web Services 开发 浏览器调用接口 大概这样, 没成功 加@WebMethod(action="get ...
- HDU 4489(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4489 解题思路这里已经说的很清楚了: http://blog.csdn.net/bossup/article/d ...
- Jenkins-在节点上执行copy命令,将节点机上的文件拷贝到映射的网络驱动盘中报错,访问被拒绝 找不到指定驱动器
问题如标题,根据网友提供的解决方法,完美解决: 在jenkins中执行这个命令时报错 说无法访问. 重新映射一次可解决这个问题,添加一条 net use 命令
- Esri大数据分析引擎GeoAnalytics Server部署经历
系统架构 Base WebGIS 4Cores 16GB Spatiotemporal Data Store 32GB SSD Disk 足够大的空间 GA Server 4Cores 16GB 足够 ...
- Oracle 给字符串补空格、补0
利用lpad().RPAD()函数来实现给字符串补空格或补0的功能: 一.lpad()lpad函数将左边的字符串填充一些特定的字符其语法格式如下:lpad(string,n,[pad_string]) ...
- 下载 github 项目文件到本地方法
下载 github 项目文件到本地方法 本篇终极,收集 3 种方法 最厉害 666 的方法 直接访问网站: 操作如下: 本地工具版下载方法 首先需要下载 git 客户端 我就不转载了,上面有客户端的使 ...
- 结对编程——Java实现黄金分割点游戏
这是我和队员根据老师要求自创的一个人机黄金分割点游戏.这个小游戏在Windows10 下开发,用Eclipse做开发工具,实现语言是Java. 利用目前自己所学的Java知识实现了一人登录,电脑自行匹 ...
- (转)informatica 面试题大全
1 What is the difference between a data warehouse and a data mart? Ø Dataware house: It is a collect ...