【[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 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...
随机推荐
- Winform学习之随笔一:Log4net
前提题要:因为我最近负责的Winform项目,好多都用到了这个log4net的日志功能,开发程序对数据一般都要求做到雁过留痕,所以日志对于我们程序员是不可或缺.因此我把对log4net的使用做一个记录 ...
- nodejs记录1——async函数
其实手动配置babel环境并不难,记录下步骤: 1.首先npm init创建一个nodejs项目 2.全局安装babel-cli处理工具:npm i babel-cli -g 3.cd到项目下安装ba ...
- google Chrome打开多个网站时等待可用的套接字,怎么加大连接数量提升速度
这是因为Chrome对同一个域名的sockets连接数作了限制,或者你访问的网站经常被墙的原因.打开Chrome的Sockets:chrome://net-internals/#sockets 点击里 ...
- 访问Django项目出现DisallowedHost at / Invalid HTTP_HOST header问题
闲来无事,想玩玩django,源码安装碰到了一堆乱七八糟依赖性问题,耗费一下午的时间总算是在ubuntu14.04上搭建好了python3+django2开发环境, 心血来潮,创建了一个django项 ...
- Java基础教程(1)--概述
一.什么是Java语言 Java是于1996年由Sun公司发布的一种极富创造力的面向对象的程序设计语言.它不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java ...
- CF891E Lust
传送门 题目大意 你有 \(n\) 个数 \(a_1,a_2...a_n\) 要进行 \(k\) 次操作 每次随机选择一个数 \(x\),使得答案加上 \(\prod_{i \neq x}a_i\) ...
- 精选10款HTML5手机模板
1.Stroller | Mobile & Tablet Responsive Template 演示地址 购买地址 2.Ocean Mobile Template 演示地址 购买地址 ...
- 浏览器组成、线程及event loop
浏览器组成 User interface: a. Every part of the browser display, except the window. b. The address bar, b ...
- 01Jenkins环境准备
01.硬件环境 Linux 64位(windows环境类似) 02.安装JDK a) 标题链接到Oracle官网下载jdk-8u144-linux-x64.rpm b) 将jdk拷贝到Linux的/t ...
- MySQL数据库更改默认引擎为Innodb【配置】
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyIS ...