题链:

单调队列优化DP
定义 dp[t][x][y] 表示第t个时间段之后,处在(x,y)位置所滑过的最长距离。
显然 dp[t][x][y] 的来源就是 dp[t-1][x'][y'],表示由(x',y')这个点滑过来的。
 
所以枚举t,x,y 以及滑行距离(以便得到(x',y')位置)进行DP,复杂度为kN³
 
然后考虑优化,
对于某个方向的滑行,不需要每次都重新枚举滑行距离,
可以用一个单调队列维护该点(x,y)的最优转移来源,然后O(1)转移,
时间优化到 kN²
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 205
using namespace std;
const int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char MP[MAXN][MAXN];
int dp[2][MAXN][MAXN];
int N,M,X,Y,K,cur,ANS;
int dis(int x,int y){
if(x<y) swap(x,y);
return x-y;
}
void transfer(int x,int y,int k,int d){
static int val[MAXN],px[MAXN],py[MAXN],l,r;
l=1; r=0;
for(int i=1,now;1<=x&&x<=N&&1<=y&&y<=M;x+=mv[k][0],y+=mv[k][1],i++){
if(MP[x][y]=='x'){
while(l<=r) l++;
dp[cur][x][y]=0;
}
else{
now=dp[cur^1][x][y]-i;
while(l<=r&&val[r]<=now) r--;
r++; val[r]=now; px[r]=x; py[r]=y;
while(l<=r&&(dis(x,px[l])>d||dis(y,py[l])>d)) l++;
dp[cur][x][y]=dp[cur^1][px[l]][py[l]]+dis(x,px[l])+dis(y,py[l]);
}
}
}
int main(){
freopen("/home/noilinux/Documents/模块学习/DP优化/1499.in","r",stdin);
scanf("%d%d%d%d%d",&N,&M,&X,&Y,&K);
memset(dp[cur],0xc0,sizeof(dp[cur]));
dp[cur][X][Y]=0;
for(int i=1;i<=N;i++) scanf("%s",MP[i]+1);
for(int k=1,s,t,d;k<=K;k++){
cur^=1;
scanf("%d%d%d",&s,&t,&d);
if(d==1) for(int j=1;j<=M;j++) transfer(N,j,0,t-s+1);
if(d==2) for(int j=1;j<=M;j++) transfer(1,j,1,t-s+1);
if(d==3) for(int i=1;i<=N;i++) transfer(i,M,2,t-s+1);
if(d==4) for(int i=1;i<=N;i++)
transfer(i,1,3,t-s+1);
}
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
ANS=max(ANS,dp[cur][i][j]);
printf("%d\n",ANS);
return 0;
}

  

●BZOJ 1499 [NOI2005]瑰丽华尔兹的更多相关文章

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

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

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

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

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

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

  4. bzoj 1499: [NOI2005]瑰丽华尔兹【dp+单调队列】

    设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取 ...

  5. NOI2005瑰丽华尔兹

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

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

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

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

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

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

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

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

随机推荐

  1. Linux kernel 的 sendfile 是如何提高性能的

    Linux kernel 的 sendfile 是如何提高性能的 现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? ...

  2. verilog学习笔记(0)

    assign赋值语句根本不允许出现在always语句块中 位于begin/end块内的多条阻塞赋值语句是串行执行的; 但是多条非阻塞赋值语句却是并行执行的,这些非阻塞赋值语句都会在其中任何一条语句执行 ...

  3. NumPy简介

    NumPy是什么? NumPy(Numerrical Python 的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组.NumPy包含很多实用的数学函数,涵盖线性代数运 ...

  4. 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置

    建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...

  5. Golang学习--开篇

    最近开始接收一个新项目,是使用Golang写的,需要重新捡起Golang来,于是就有了这个系列博客. Golang的环境配置,我就不说了,让我们直接开始. Golang官网:https://golan ...

  6. JaveScript内置对象(JS知识点归纳八)

    1)JS自身提供的方式 用于对数据进行简便的操作,根据方法可以操作的数据类型不同,形成了不同的对象--内置对象 2)数组 ​ a)基本操作方法--对数组进行修改 从数组最后进行操作 1)数组.push ...

  7. Gitlab的安装及项目新建

    1. Gitlab的安装及仓库创建 1.1下载gitlab安装包 1).官网下载速度较慢 建议先行下载 国内的源里面可以找到最新的版本https://mirrors.tuna.tsinghua.edu ...

  8. "双非"应届生校招如何获得大厂青睐?(内附技术岗超全求职攻略)

    写在前面的话 笔者从17年的2月份开始准备春招,其中遇到不少坑,也意识到自己走过的弯路.故写了这篇文章总结一番,本文适合主动学习的,对自己要学的课程不明确的,对面试有恐惧症的...等将来打算从事技术岗 ...

  9. os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了

    os.getcwd().sys.path[0].sys.argv[0]和__file__的区别 要分清这几个的区别与使用条件,实际测试一下是最准确的. 设计测试方法: 一个主模块用来运行,一个子模块用 ...

  10. Python-面向对象(一)-Day7

    Day7-面向对象基础 1一.isinstance(obj, cls) 1二.issubclass(sub, super) 1三.异常处理 11.异常基础 12.异常种类 23.异常其他结构 54.主 ...