非常无脑和码农的单调队列优化\(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]瑰丽华尔兹】的更多相关文章

  1. NOI2005瑰丽华尔兹

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

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

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

  3. luogu P2254 [NOI2005]瑰丽华尔兹

    题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...

  4. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

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

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

  6. 单调队列优化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 ...

  7. P2254 [NOI2005]瑰丽华尔兹

    链接P2254 [NOI2005]瑰丽华尔兹 首先有个很朴素的\(dp\),设\(f_{i,j,k}\)表示\(k\)时刻地点\(i,j\)的最长长度. 然后这样不能优化,考虑利用一段连续时间是同一个 ...

  8. 题解-[NOI2005]瑰丽华尔兹

    题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...

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

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

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

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

随机推荐

  1. String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace

    String.IsNullOrEmpty 指示指定的字符串是否为 null 或者 空字符串: 返回值:如果参数为 null 或者 空字符串("" .String.Empty),结果 ...

  2. <深入理解JavaScript>学习笔记(1)_编写高质量JavaScript代码的基本要点

    注:本文是拜读了 深入理解JavaScript 之后深有感悟,故做次笔记方便之后查看. JQuery是一个很强大的JavaScript 类库,在我刚刚接触JavaScript的就开始用了. JQuer ...

  3. WCF 创建WCF

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  4. GridFS使用及配合nginx实现文件服务

    Mongodb下GridFS使用及配合nginx实现文件服务 一.GridFS简介 GridFS是mongodb下用来存储文件的一种规范,所有官方支持的驱动均实现了GridFS规范. Mongodb本 ...

  5. 阿里云服务器(Ubuntu16.04 64位)远程连接

    购买阿里云服务器 1.打开阿里云官方网站,账号登录,选择产品中的云服务器 ECS 2.根据自身需求,选择合适的阿里云服务器系统,(1)点击一键购买,(2)选择地域,(3)根据自身需求,选择系统,这里选 ...

  6. 二、多线程之Atomic包

    一.简介 1.原子操作 我们在使用变量的时候,经常会出现资源竞争的情况,为了保证变量安全,我们就会对对应的方法添加"synchronized"同步锁来达到目的,以保证线程安全. 而 ...

  7. mac obs直播软件 无法输出音频解决办法

    搜索大量的网页,确没有一个实用的设置教程,也正是speechless. 直接做个教程,方便大家的使用 1.安装 boom 2 到app store 上搜索boom 我安装的是正版的,需要128元. 你 ...

  8. java调用 C# webservice接口

    java调用webservice接口方式有多种,本人很懒,测试一种满足我的需求,故为试验其他方法,仅供参考 一:工具 MyEclipse,C#编码发布的webservice接口 二:步骤 1.打开my ...

  9. 系统分析与设计 homework-1

    1.软件工程的定义 软件工程是将系统化.规范化.可度量的方法应用于软件的开发.运营和维护上,也就是将工程方法应用于软件上,并对这些方法的研究. 2.软件危机(software crisis) 软件危机 ...

  10. css 各种常见布局整理

    在学习各种布局之前我们先来认识各个关键词,理解这些关键词,然后由点到面,这样就简单多了. display属性 页面中每个元素都有一个默认的display属性,它的值与该元素的类型有关,默认值通常是 b ...