非常无脑和码农的单调队列优化\(dp\)

我们发现一个时间段内移动的情况是一样的,而时间段的数目又非常少,所以可以直接按照时间段来进行\(dp\)

由于每一次\(dp\)的移动距离都是小于等于某一个固定值的,于是可以直接上单调队列优化

复杂度\(O(nmk)\)

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 205
#define max(a,b) ((a)>(b)?(a):(b))
int dp[maxn][maxn],now[maxn][maxn];
int n,m,sx,sy,K;
int S,E,wind;
char map[maxn][maxn];
int h,t,q[maxn];
inline int read()
{char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int main()
{n=read(),m=read(),sx=read(),sy=read(),K=read();for(re int i=1;i<=n;i++) scanf("%s",map[i]+1);memset(dp,-20,sizeof(dp)),memset(now,-20,sizeof(now));now[sx][sy]=dp[sx][sy]=0;for(re int O=1;O<=K;O++){S=read(),E=read(),wind=read();int T=E-S+1;memset(now,-20,sizeof(now));if(wind==4){for(re int i=1;i<=n;i++){h=1,t=0;memset(q,0,sizeof(q));for(re int j=2;j<=m;j++){while(h<=t&&dp[i][q[t]]-q[t]<dp[i][j-1]-j+1) t--;q[++t]=j-1;if(map[i][j-1]=='x') while(h<=t) h++;if(map[i][j]=='x') continue;while(h<=t&&q[h]+T<j) h++;if(h<=t) now[i][j]=max(dp[i][j],j+dp[i][q[h]]-q[h]);}}}if(wind==3){for(re int i=1;i<=n;i++){h=1,t=0;memset(q,0,sizeof(q));for(re int j=m-1;j>=1;j--){while(h<=t&&dp[i][q[t]]+q[t]<dp[i][j+1]+j+1) t--;q[++t]=j+1;if(map[i][j+1]=='x') while(h<=t) h++;if(map[i][j]=='x') continue;while(h<=t&&j+T<q[h]) h++;if(h<=t) now[i][j]=max(dp[i][j],dp[i][q[h]]+q[h]-j);}}}if(wind==2){for(re int j=1;j<=m;j++){h=1,t=0;memset(q,0,sizeof(q));for(re int i=2;i<=n;i++){while(h<=t&&dp[q[t]][j]-q[t]<dp[i-1][j]-i+1) t--;q[++t]=i-1;if(map[i-1][j]=='x') while(h<=t) h++;if(map[i][j]=='x') continue;while(h<=t&&q[h]+T<i) h++;if(h<=t) now[i][j]=max(dp[i][j],i+dp[q[h]][j]-q[h]);}}}if(wind==1){for(re int j=1;j<=m;j++){h=1,t=0;for(re int i=n-1;i>=1;i--){while(h<=t&&dp[q[t]][j]+q[t]<dp[i+1][j]+i+1) t--;q[++t]=i+1;if(map[i+1][j]=='x') while(h<=t) h++;if(map[i][j]=='x') continue;while(h<=t&&i+T<q[h]) h++;if(h<=t) now[i][j]=max(dp[i][j],dp[q[h]][j]+q[h]-i);}}}for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++)dp[i][j]=max(dp[i][j],now[i][j]);}int ans=0;for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++)ans=max(ans,dp[i][j]);std::cout<<ans;return 0;
}

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

最新文章

  1. IIS7.5 错误代码0x8007007e HTTP 错误 500.19
  2. Java 8 (8) 默认方法
  3. matlab div矩阵运算,【求助】多维矩阵求和运算!!
  4. Java-Java I/O流解读之java.io.PrintStream java.io.PrintWriter
  5. Flask中session和cookies的设置、删除、修改、获取
  6. Boost锁~临界区保护和临界资源共享
  7. 跟随光标下划线导航插件
  8. [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件
  9. oracle数据库连接 ORA-12638:身份证明检索失败
  10. vue路由匹配实现包容性_包容性设计:面向老年用户的数字平等
  11. Linux 下的多线程下载工具
  12. 《网络对抗》 逆向及Bof基础实践
  13. Android 点击按钮,文本文字改变
  14. 事物级别,不可重复读和幻读的区别
  15. 我在Facebook工作四年的总结与反思
  16. 夜拍王荣耀10 VS同档位旗舰机夜拍功能,实战结果一目了然!
  17. 解决小米miui系统调用系统裁剪图片功能崩溃失败的问题
  18. NISP-SO安全运维工程师需要掌握的核心能力
  19. 前端JavaScript的学习笔记
  20. GitHub新手用法详解【适合新手入门-建议收藏!!!】

热门文章

  1. c++字符数组整数转换中文大写金额的形式_如何对PHP日期数组进行排序
  2. RFID 是什么意思
  3. 小财靠勤,中财靠德,大财靠命,现在多少钱才是小财?
  4. 三个火一个木组成的燊怎么读,燊是什么意思?
  5. 路由器经常掉线,必须重新插拔网线才能上网,什么原因?
  6. 12306外包给阿里巴巴、IBM等大企业做是否可行?
  7. Golang包管理工具之govendor的使用
  8. 软件工程--瀑布模型
  9. PHP是4个进程还是五个,PHP多进程(4) :内部多进程
  10. azure 入门_Azure Function应用程序入门