题目链接
题目描述
不妨认为舞厅是一个 NNN 行 MMM 列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地。钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长。每个时刻,钢琴都会随着船体倾斜的方向向相邻的方格滑动一格,相邻的方格可以是向东、向西、向南或向北的。而艾米丽可以选择施魔法或不施魔法:如果不施魔法,则钢琴会滑动;如果施魔法,则钢琴会原地不动。

艾米丽是个天使,她知道每段时间的船体的倾斜情况。她想使钢琴在舞厅里滑行的路程尽量长,这样 1900 会非常高兴,同时也有利于治疗托尼的晕船。但艾米丽还太小,不会算,所以希望你能帮助她。

输入输出格式
输入格式

输入文件的第一行包含 555 个数 NNN, MMM, xxx, yyy 和 KKK。NNN 和 MMM 描述舞厅的大小,xxx 和 yyy 为钢琴的初始位置;我们对船体倾斜情况是按时间的区间来描述的,且从 111 开始计算时间,比如 “在 [1,3][1, 3][1,3] 时间里向东倾斜,[4,5][4, 5][4,5] 时间里向北倾斜”,因此这里的 KKK 表示区间的数目。

以下 NNN 行,每行 MMM 个字符,描述舞厅里的家具。第 iii 行第 jjj 列的字符若为 .,则表示该位置是空地;若为 x,则表示有家具。

以下 KKK 行,顺序描述 KKK 个时间区间,格式为:sitidi(1≤i≤K)s_i t_i d_i (1 \leq i \leq K)si​ti​di​(1≤i≤K)。表示在时间区间 [si,ti][s_i, t_i][si​,ti​] 内,船体都是向 did_idi​ 方向倾斜的。did_idi​ 为 111, 222, 333, 444 中的一个,依次表示北、南、西、东(分别对应矩阵中的上、下、左、右)。输入保证区间是连续的,即

s1=1s_1 = 1s1​=1

ti=si−1+1(1<i≤K)t_i = s_{i-1} + 1 (1<i \leq K)ti​=si−1​+1(1<i≤K)

tK=Tt_K = TtK​=T
输出格式

输出文件仅有 111 行,包含一个整数,表示钢琴滑行的最长距离 (即格子数)。

输入输出样例
输入样例 #1
4 5 4 1 3

..xx.
.....
...x.
.....
1 3 4
4 5 1
6 7 3

输出样例 #1

6

说明
钢琴的滑行路线:

钢琴在“×”位置上时天使使用一次魔法,因此滑动总长度为 666。

【数据范围】

50%50\%50% 的数据中,1≤N,M≤200,T≤2001\leq N, M\leq 200,T\leq 2001≤N,M≤200,T≤200;

100%100\%100% 的数据中,1≤N1\leq N1≤N, M≤200M \leq 200M≤200,K≤200K \leq 200K≤200,T≤40000T\leq 40000T≤40000。

设 f[i][x][y]f[i][x][y]f[i][x][y] 表示第 iii 段区间结束后位于坐标 (x,y)(x,y)(x,y) 的最大位移;dx,dydx,dydx,dy 分别表示 第 iii 段区间中的每一步横纵坐标的变化值。
则转移方程为
f[i][x][y]=max⁡(f[i−1][x−j⋅dx][y−j⋅dy]+j)f[i][x][y]=\max(f[i-1][x-j\cdot dx][y-j\cdot dy]+j) f[i][x][y]=max(f[i−1][x−j⋅dx][y−j⋅dy]+j)
令 x′=x−j⋅dxx'=x-j\cdot dxx′=x−j⋅dx ;y′=y−j⋅dyy'=y-j\cdot dyy′=y−j⋅dy ,则 j=∣x∣−∣x′∣j=|x|-|x'|j=∣x∣−∣x′∣ 或 ∣y∣−∣y′∣|y|-|y'|∣y∣−∣y′∣ 。
由于每一个区间的 dp 转移在方格中都是在同一行或列中,可以对每一行或列单独处理,将上述 jjj 的结果移到转移方程两边发现可以利用单调队列优化。时间复杂度为 O(NMK)O(NMK)O(NMK) 。

#include<bits/stdc++.h>using namespace std;
const int N = 205;
int n, m, ans;
char a[N][N];
const int dx[5] = {0, -1, 1, 0, 0};
const int dy[5] = {0, 0, 0, -1, 1};
struct {int f, i;
} q[N];
int f[N][N];inline void calc(int x, int y, int len, int d) {int l = 1, r = 0;for (int i = 0; x >= 1 && x <= n && y >= 1 && y <= m; i++, x += dx[d], y += dy[d]) {if (a[x][y] == 'x')l = 1, r = 0;else {while (l <= r && q[r].f - q[r].i <= f[x][y] - i)r--;q[++r] = {f[x][y], i};while (l <= r && q[r].i - q[l].i > len)l++;f[x][y] = q[l].f + i - q[l].i;ans = max(ans, f[x][y]);}}
}int main() {int x, y, k;scanf("%d%d%d%d%d", &n, &m, &x, &y, &k);for (int i = 1; i <= n; i++)scanf("%s", a[i] + 1);memset(f, -0x3f, sizeof(f)), f[x][y] = 0;for (int i = 1, s, t, d; i <= k; i++) {scanf("%d%d%d", &s, &t, &d);switch (d) {case 1:for (int j = 1; j <= m; j++)calc(n, j, t - s + 1, d);break;case 2:for (int j = 1; j <= m; j++)calc(1, j, t - s + 1, d);break;case 3:for (int j = 1; j <= n; j++)calc(j, m, t - s + 1, d);break;default:for (int j = 1; j <= n; j++)calc(j, 1, t - s + 1, d);}}printf("%d\n", ans);return 0;
}

P2254 [NOI2005] 瑰丽华尔兹相关推荐

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

    P2254 [NOI2005]瑰丽华尔兹 题目背景 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意? 众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世 ...

  2. P2254 [NOI2005]瑰丽华尔兹

    P2254 [NOI2005]瑰丽华尔兹 模型总结 单调队列优化线性dp 关键点 单调队列中只需存储下标 只能优化最内层循环 dp[c-1][x][y]>=dp[c-1][x][que[tl]] ...

  3. [NOI2005] 瑰丽华尔兹

    [NOI2005] 瑰丽华尔兹 \[ \mathfrak{<<The Crave>>} \] 题目大意:\(N\times M\)的矩阵,\(T\)个时间段,某个特定的时间段可 ...

  4. BZOJ1499: [NOI2005]瑰丽华尔兹

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

  5. [NOI2005]瑰丽华尔兹

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

  6. [NOI2005]瑰丽华尔兹 动态规划 + 单调队列

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

  7. [NOI2005]瑰丽华尔兹(DP+单调队列优化)

    题目来源:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有 ...

  8. BZOJ 1499 [NOI2005]瑰丽华尔兹 动态规划(+单调队列)

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

  9. bzoj1499 [NOI2005]瑰丽华尔兹

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

最新文章

  1. 2021年大数据Flink(二十一):​​​​​​​案例三 会话窗口
  2. ML之FE:基于FE特征工程对RentListingInquries数据集进行预处理并导出为三种格式文件(csv格式/txt格式/libsvm稀疏txt格式)
  3. python操作mycat只操作主库【解决办法】
  4. android Rom 制作2
  5. CSS:页脚紧贴底部
  6. 前端学习(1546):MVC思想
  7. c++ 协程_用yield实现协程
  8. C++11新特性之十:enable_shared_from_this
  9. Shell编程基础(1)
  10. 软件测试基础 - 系统测试
  11. 53. Element setAttribute() 方法
  12. spring 定时任务表达式正确性校验
  13. 在Ubuntu18.04上安装视频播放器smplayer
  14. n++和++n的区别
  15. 软件测试的艺术_读书笔记(一)
  16. 朋友圈发圈助手文案,头像,壁纸组合微信小程序源码下载
  17. web前端 js实现频域水印制作
  18. 传感器模组:手机摄像头模组-1亿像素是如何实现的?
  19. 软件项目管理MOOC(北邮)——第七章测试答案
  20. 技术人变现的9个路线

热门文章

  1. U8备份提示“远程组件初始化失败”
  2. SQ01报表添加事物码
  3. Windows PowerShell 中启动 Nginx 报错解决方案
  4. 计算机组成原理徐福培,徐福培计算机组成原理(第2章).ppt
  5. Win10开启和使用Hyper-V功能
  6. c语言程序流程图绘制软件,程序员都是用什么画图工具绘制C语言程序流程图?这个方法你需要知道...
  7. supplier java8_Java 8之 Supplier示例
  8. Servlet的使用(2198)
  9. 关于RNN理论和实践的一些总结
  10. Android_ProGuard一览天下