题链:

单调队列优化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. 201621123050 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  2. 团队作业7——第二次项目冲刺(Beta版本计划及安排)

     Beta版本冲刺       需要改进完善的功能 1.寻找BUG.并解决问题 2.界面的优化 下一阶段新增的功能' 1.个人信息头像上传 2.头像裁剪功能 需要改进的团队分工 1.之前产品的主要工作 ...

  3. Archlinux安装和使用技巧

    一 准备工作 1  文件下载及启动盘制作 文件可以在https://mirrors.ustc.edu.cn/,这是个中科大的镜像网,选择如下: 下载完成后,就是制作一个启动盘,我使用的是Linux下强 ...

  4. D的下L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  5. 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API

    Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engine of applicat ...

  6. SpringBoot的HelloWorld 应用及解释

    参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...

  7. 浅谈Web网站的架构演变过程

    前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 阶 ...

  8. 【第十九篇】laydate设置起始时间,laydate设置开始时间和结束时间

    laydate设置开始时间后,结束时间不可小于已选择的开始时间 laydate设置结束时间后,开始时间不可小于已选择的结束时间 //设置开始时间 var startDate = laydate.ren ...

  9. python基础-循环

    循环 循环 要计算1+2+3,我们可以直接写表达式: >>> 1 + 2 + 3 6 要计算1+2+3+...+10,勉强也能写出来. 但是,要计算1+2+3+...+10000,直 ...

  10. CSS Box Model 盒子模型

    1. 介绍 1.1 什么是 Box Model 在HTML中的每个element(元素)都可以看作一个矩形的盒子,矩形从内到外依次由元素的内容(content).内边距(padding).边框(bor ...