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

题面

BZOJ

题解

先写部分分
设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数
这样子每一步要么停要么走
时间复杂度\(O(nmt)\)
得分\(40~70\)分
(据说这样能过???)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 210
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
char g[MAX][MAX];
int ans,n,m,X,Y,K,L[MAX],R[MAX],D[MAX];
int d[5][2]={0,0,-1,0,1,0,0,-1,0,1};
int f[2][MAX][MAX],T[MAX*MAX];
int main()
{n=read();m=read();X=read();Y=read();K=read();for(int i=1;i<=n;++i)scanf("%s",g[i]+1);for(int i=1;i<=K;++i)L[i]=read(),R[i]=read(),D[i]=read();for(int i=1;i<=K;++i)for(int j=L[i];j<=R[i];++j)T[j]=D[i];memset(f,-1,sizeof(f));f[0][X][Y]=0;int nw=1,pw=0;for(int tt=1;tt<=R[K];++tt,nw^=1,pw^=1){for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)f[nw][i][j]=-1;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){if(f[pw][i][j]==-1)continue;int xx=i+d[T[tt]][0],yy=j+d[T[tt]][1];f[nw][i][j]=max(f[nw][i][j],f[pw][i][j]);if(xx<1||yy<1||xx>n||yy>m)continue;if(g[xx][yy]=='x')continue;f[nw][xx][yy]=max(f[nw][xx][yy],f[pw][i][j]+1);}}for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)ans=max(ans,f[R[K]&1][i][j]);printf("%d\n",ans);return 0;
}

发现转移可以用单调队列优化
于是分四种情况进行讨论
用单调队列优化转移即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 210
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
char g[MAX][MAX];
int ans,n,m,X,Y,K,L[MAX],R[MAX],D[MAX];
int d[5][2]={0,0,-1,0,1,0,0,-1,0,1};
int f[2][MAX][MAX],T[MAX*MAX];
int Q[MAX],h,t;
int main()
{n=read();m=read();X=read();Y=read();K=read();for(int i=1;i<=n;++i)scanf("%s",g[i]+1);for(int i=1;i<=K;++i)L[i]=read(),R[i]=read(),D[i]=read();for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)f[0][i][j]=-1e9;f[0][X][Y]=0;int nw=1,pw=0;for(int tt=1;tt<=K;++tt,nw^=1,pw^=1){for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)f[nw][i][j]=f[pw][i][j];if(D[tt]==1)for(int j=1;j<=m;++j){h=1;t=0;for(int i=n;i;--i){if(g[i][j]=='x'){h=1;t=0;continue;}while(h<=t&&Q[h]-i>R[tt]-L[tt]+1)++h;while(h<=t&&f[pw][Q[t]][j]+Q[t]<=f[pw][i][j]+i)--t;Q[++t]=i;if(h<=t)f[nw][i][j]=f[pw][Q[h]][j]+Q[h]-i;}}else if(D[tt]==2)for(int j=1;j<=m;++j){h=1;t=0;for(int i=1;i<=n;++i){if(g[i][j]=='x'){h=1;t=0;continue;}while(h<=t&&i-Q[h]>R[tt]-L[tt]+1)++h;while(h<=t&&f[pw][Q[t]][j]-Q[t]<=f[pw][i][j]-i)--t;Q[++t]=i;if(h<=t)f[nw][i][j]=f[pw][Q[h]][j]+i-Q[h];}}else if(D[tt]==3)for(int i=1;i<=n;++i){h=1;t=0;for(int j=m;j;--j){if(g[i][j]=='x'){h=1;t=0;continue;}while(h<=t&&Q[h]-j>R[tt]-L[tt]+1)++h;while(h<=t&&f[pw][i][Q[t]]+Q[t]<=f[pw][i][j]+j)--t;Q[++t]=j;if(h<=t)f[nw][i][j]=f[pw][i][Q[h]]+Q[h]-j;}}elsefor(int i=1;i<=n;++i){h=1;t=0;for(int j=1;j<=m;++j){if(g[i][j]=='x'){h=1;t=0;continue;}while(h<=t&&j-Q[h]>R[tt]-L[tt]+1)++h;while(h<=t&&f[pw][i][Q[t]]-Q[t]<=f[pw][i][j]-j)--t;Q[++t]=j;if(h<=t)f[nw][i][j]=f[pw][i][Q[h]]+j-Q[h];}}}for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)ans=max(ans,f[K&1][i][j]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8478525.html

【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)相关推荐

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

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

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

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

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

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

  4. bzoj1499 [NOI2005]瑰丽华尔兹

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

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

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

  6. [NOI2005] 瑰丽华尔兹

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

  7. P2254 [NOI2005]瑰丽华尔兹

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

  8. [NOI2005]瑰丽华尔兹

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

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

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

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

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

最新文章

  1. linux下的oracle10g rman备份
  2. 【数字信号处理】傅里叶变换性质 ( 序列对称分解定理示例 | 共轭对称序列与原序列之间的关系 | 共轭反对称序列与原序列之间的关系 )
  3. flash socket通信问题
  4. 1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入
  5. [BUUCTF-pwn]——suctf_2018_stack
  6. 《自动化技术中的进给电气传动》1.4节读书笔记
  7. php创建分页类,一个最强的PHP通用分页类
  8. java做网页客户端_如何成为 Java web开发者
  9. Java爬虫Jsoup篇
  10. 程序员转行可以做什么?
  11. Fibonacci Sum(二项式求和)
  12. (20181111)Fortran 产生随机数
  13. 学习打卡:动手数据分析Task01
  14. GIT回顾(持续更新)
  15. 嵌入式软件算法之卡尔曼滤波基本原理浅析
  16. ant Design vue中a-row 内容不会垂直居中
  17. Python基础知识学习(一)——Python语言概述、安装、运行、变量、数据类型概述
  18. php cgminer,CGMINER中各个参数代表的意义(挖矿黑框参数)
  19. 实现ChatGPT项目(可商用:web端、接入qq群、公众号、企业微信)
  20. 自然语言菜鸟学习笔记(七):RNN(循环神经网络)及变体(LSTM、GRU)理解与实现(TensorFlow)

热门文章

  1. Android Studio中使用Git进行代码管理(分支、合并)
  2. python + selenium 练习篇 - 定位元素的方法
  3. 光伏巨头“脱轨” 英利确认债务重组
  4. JS实现让页脚一直固定在页面底部
  5. 2、Android构建本地单元测试
  6. 我的Android进阶之旅------gt;Android Studio 快捷键整理分享
  7. 关于ExtJs4的Grid带 查询 参数 分页(baseParams--extraParams)
  8. Oracle中添加自动编号的序列
  9. ASP.NET实现页面传值的几种方法
  10. eclipse idea对比_Idea必须配置的环境变量(自己总结)