传送门

开始之前先致敬一下伟大的海上钢琴师1900.

我们想到可以对于每一个时间段进行DP,这样的话,用dp[i][j][t]表示在第t个时间段的结束,钢琴在第(i,j)位置的时候最远行走的路程。对于不同的方向转移不大一样,有dp[i][j][t] = max{dp[p][q][t-1] + i - p + j - q},其中(p,q)是上一次钢琴的位置。p,q的范围可以自行进行确定。(至于为什么可以这样转移,因为小天使帮忙固定了,就相当于是你转移的范围变小了)

所以说其实这个也是可以转化为单调队列优化DP的,dp[i][j][t]可以说是由前一段区间(也就是钢琴能滑到的范围转移过来的),直接用单调队列优化一下就可以了。

这道题需要分类讨论四个方向,注意从四个方向的起始点是不同的,然后其他的操作就没什么特殊的啦。由于单调队列可以自动为我们保存在t-1时间段的情况,所以其实t那一维不需要开,直接转化成二维DP。

还有很重要的一点,因为道路上存在箱子,箱子隔开的两段路是不能转移的,所以在DP过程中如果遇到箱子的话,立即清空单调队列,继续DP即可。一开始因为其他地点是不合法情况,要初始化为-INF,只有开始点是0.

看一下代码。

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 10005;
const int INF = 1000000009;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}struct line
{int l,r,dir;
}a[205];struct node
{int val,pos;
}q[205];int n,m,sx,sy,k,dp[205][205],g[205][205],head,tail,ans;
int dx[5] = {0,-1,1,0,0},dy[5] = {0,0,0,-1,1};
char s[205];void solve(int x,int y,int len,int dir,int t)
{head = 1,tail = 0;int cnt = 0;while(++cnt){if(x < 1 || x > n || y < 1 || y > m) break;if(g[x][y]) head = 1,tail = 0;else{while(head <= tail && q[tail].val + cnt - q[tail].pos <= dp[x][y]) tail--;q[++tail].val = dp[x][y],q[tail].pos = cnt;while(head <= tail && q[head].pos < cnt - len) head++;dp[x][y] = max(dp[x][y],q[head].val + cnt - q[head].pos);}x += dx[dir],y += dy[dir];}
}int main()
{n = read(),m = read(),sx = read(),sy = read(),k = read();rep(i,1,n){scanf("%s",s+1);rep(j,1,m) if(s[j] == 'x') g[i][j] = 1;}rep(i,1,k) a[i].l = read(),a[i].r = read(),a[i].dir = read();memset(dp,-0x3f,sizeof(dp));dp[sx][sy] = 0;rep(p,1,k){int len = a[p].r - a[p].l + 1;if(a[p].dir == 1) rep(i,1,m) solve(n,i,len,a[p].dir,p);if(a[p].dir == 2) rep(i,1,m) solve(1,i,len,a[p].dir,p);if(a[p].dir == 3) rep(i,1,n) solve(i,m,len,a[p].dir,p);if(a[p].dir == 4) rep(i,1,n) solve(i,1,len,a[p].dir,p);}rep(i,1,n)rep(j,1,m) ans = max(ans,dp[i][j]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/captain1/p/9929727.html

NOI2005 瑰丽华尔兹相关推荐

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

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

  2. [NOI2005] 瑰丽华尔兹

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

  3. P2254 [NOI2005]瑰丽华尔兹

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

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

  10. 【[NOI2005]瑰丽华尔兹】

    非常无脑和码农的单调队列优化\(dp\) 我们发现一个时间段内移动的情况是一样的,而时间段的数目又非常少,所以可以直接按照时间段来进行\(dp\) 由于每一次\(dp\)的移动距离都是小于等于某一个固 ...

最新文章

  1. [转载]一站式WPF--Window
  2. L1-018 大笨钟
  3. HashSet集合介绍
  4. 轻量级的jQuery表单校验插件: Happy.js
  5. php的正则匹配方法preg_match_all问题
  6. 红米note3支持html,红米note3如何检测硬件信息?指令代码说明
  7. POJ NOI MATH-7654 等差数列末项计算
  8. phpstudy配置域名后apache无法启动
  9. 功能详细设计文档模板
  10. Java处理wangeditor上传图片并升级一下
  11. 计算机网络教室环境的作用,网络教室环境与多媒体教室环境相比优势在什么地方...
  12. android 密码输入框 星号,input密码框输入后设置显示为星号或其他样式
  13. oracle hugepage设置,Linux系统下快速配置HugePages的完整步骤
  14. 我来学网络——WAN、LAN、MAN带表什么?
  15. Android下的特殊文件夹
  16. mysql按中文拼音排序_按拼音排序,mysql 按中文拼音顺序排序
  17. 4.pycharm(免费专业版)下载与安装与环境配置
  18. w指令中的IDLE是什么意思
  19. python读取身份证中的生日信息
  20. 洛谷:P6062 [USACO05JAN]Muddy Fields G

热门文章

  1. mysql 字符串搜_Mysql搜索字符串
  2. linux中iso源码解压_Linux系统下iso文件的制作和解压以及加载
  3. 分布有限传输速度高的计算机网络,第5章 计算机网络基础.ppt
  4. IntelliJ IDEA Maven Mybatis generator 自动生成代码 MAC系统
  5. dubbox 2.8.4的配置和使用
  6. windows10查看本机IP脚本
  7. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中练习-自定义函数模型拼接...
  8. nginx负载均衡的5种策略(转载)
  9. vuex模块相互调用
  10. 超市商品购买与管理系统