Description

题库链接

给你一张 \(n\times m\) 的棋盘,棋盘上有一些障碍。一共 \(t\) 个时刻,被分为 \(k\) 段,在每一段中都有一个向上/下/左/右倾斜的趋势(持续时间 \(q_i\))。

1 时刻一架钢琴在 \((x_0,y_0)\) 处,你可以在任意时刻控制它动或不动,若动则该时刻会向趋势方向滑动一格。要求在任何时刻都不能出棋盘或碰到障碍,问你 \(t\) 时刻内最多滑动多少格。

\(1\leq n,m,k\leq 200\)

Solution

设 \(f_{i,x,y}\) 为第 \(i\sim k\) 个时段 \(i\) 时段初始时候在 \((x,y)\) 处的最小花费。则答案为 \(f_{1,x_0,y_0}\)。

假设第 \(i\) 个时段向左滑,那么 \(f_{i,x,y}=\max\limits_{x-a\leq q_i}f_{i+1,a,y}+x-a\),其中 \((a,y)\sim(x,y)\) 中无障碍。

容易发现 \(a\) 是可以用单调队列优化的。

其余方向同理。总复杂度 \(O(nmk)\)。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 205; int n, m, x, y, k, mp[N][N], s[N], t[N], d[N], f[2][N][N], id;
int q[N], head, tail;
char ch[N]; void work1(int j) {
head = 1, tail = 0;
for (int i = 1; i <= n; i++) {
if (mp[i][j]) {head = 1, tail = 0; continue; }
while (head <= tail && f[0][q[tail]][j]-q[tail] < f[0][i][j]-i) --tail;
q[++tail] = i;
while (i-q[head] > t[id]) ++head;
f[1][i][j] = f[0][q[head]][j]+i-q[head];
}
}
void work2(int j) {
head = 1, tail = 0;
for (int i = n; i >= 1; i--) {
if (mp[i][j]) {head = 1, tail = 0; continue; }
while (head <= tail && f[0][q[tail]][j]+q[tail] < f[0][i][j]+i) --tail;
q[++tail] = i;
while (q[head]-i > t[id]) ++head;
f[1][i][j] = f[0][q[head]][j]+q[head]-i;
}
}
void work3(int i) {
head = 1, tail = 0;
for (int j = 1; j <= m; j++) {
if (mp[i][j]) {head = 1, tail = 0; continue; }
while (head <= tail && f[0][i][q[tail]]-q[tail] < f[0][i][j]-j) --tail;
q[++tail] = j;
while (j-q[head] > t[id]) ++head;
f[1][i][j] = f[0][i][q[head]]+j-q[head];
}
}
void work4(int i) {
head = 1, tail = 0;
for (int j = m; j >= 1; j--) {
if (mp[i][j]) {head = 1, tail = 0; continue; }
while (head <= tail && f[0][i][q[tail]]+q[tail] < f[0][i][j]+j) --tail;
q[++tail] = j;
while (q[head]-j > t[id]) ++head;
f[1][i][j] = f[0][i][q[head]]+q[head]-j;
}
}
int main() {
scanf("%d%d%d%d%d", &n, &m, &x, &y, &k);
for (int i = 1; i <= n; i++) {
scanf("%s", ch+1);
for (int j = 1; j <= m; j++) mp[i][j] = ch[j] == 'x';
}
for (int i = 1; i <= k; i++) scanf("%d%d%d", &s[i], &t[i], &d[i]), t[i] = t[i]-s[i]+1;
for (id = k; id >= 1; id--) {
memcpy(f[0], f[1], sizeof(f[0]));
memset(f[1], 0, sizeof(f[0]));
if (d[id] == 1) for (int i = 1; i <= m; i++) work1(i);
else if (d[id] == 2) for (int i = 1; i <= m; i++) work2(i);
else if (d[id] == 3) for (int i = 1; i <= n; i++) work3(i);
else if (d[id] == 4) for (int i = 1; i <= n; i++) work4(i);
}
printf("%d\n", f[1][x][y]);
return 0;
}

[NOI 2005]瑰丽华尔兹的更多相关文章

  1. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  2. NOI2005瑰丽华尔兹

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

  3. 【BZOJ1499】瑰丽华尔兹(动态规划)

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

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

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

  5. 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

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

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

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

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

  8. 【DP】【单调队列】【NOI2005】瑰丽华尔兹

    340. [NOI2005] 瑰丽华尔兹 ★★★ 输入文件:adv1900.in 输出文件:adv1900.out 简单对照 时间限制:1 s 内存限制:128 MB [任务描写叙述] 你跳过华尔兹吗 ...

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

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

随机推荐

  1. Windows系统重装记录

    材料: u盘(需4g以上) windows官方镜像 附:windows个版本比较 步骤: u盘格式化(为了装启动盘系统需要清空数),备份系统盘所需要的的数据 下载适合自己的官方镜像,可从该网站下载(官 ...

  2. django ForeignKey ManyToMany 前后端联动

    总结 外键基本和普通的字段是一样的 多对多 获取 getlist() 更新 clear() add() remove() 前端和后端是通过字符串沟通的,所以使用ajax的时候如果是数据类型,记得要JS ...

  3. acm数论之旅--组合数(转载)

    随笔 - 20  文章 - 0  评论 - 73 ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) )  补充:全错排公式:https://blog.csdn.net/Carey_Lu/ ...

  4. java_设计模式_装饰设计模式

    package IO; /* * 装饰设计模式 模拟咖啡 * 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) * 2.具体组件:需要装饰的对象 * 3.抽像装饰类:包含了对抽象组件的引用以及装饰着 ...

  5. mysql测试点

    前言 性能测试过程中,数据库相关指标的监控是不可忽视的,在这里我们就MySQL的监控配置及重点涉及性能的一些参数进行说明. 在笔者的日常性能测试过程中,重点关注了这些参数,但不代表仅仅只有这些参数对性 ...

  6. 从0到1了解 CI/CD

    现代软件开发的需求加上部署到不同基础设施的复杂性使得创建应用程序成为一个繁琐的过程.当应用程序出现规模性增长,开发团队人员变得更分散时,快速且不断地生产和发布软件的流程将会变得更加困难.为了解决这些问 ...

  7. Go类型断言

    package main import ( "fmt" ) type Point struct { x int y int } func main() { var a interf ...

  8. 基于Tesseract实现图片文字识别

    一.简介  Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[l ...

  9. 9. 图解分析Redis的RDB和AOF两种持久化机制的原理

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  10. iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用

    #import <WebViewJavascriptBridge.h> /// @interface ZWBridgeViewController ()<WKNavigationDe ...