http://www.lydsy.com/JudgeOnline/problem.php?id=1499

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

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

……其实这是单调队列优化吧……

我们有一个显然的f[i][j][k]表示在i时间段内钢琴到(j,k)处时最大移动距离。

显然f可以很简单的转移,但是复杂度会爆炸。

但是又显然可以对每个点单调队列优化……

而且既然不是斜率优化,所以单调队列的维护也很简单,直接看代码吧。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. const int T=;
  9. const int N=;
  10. inline int read(){
  11. int X=,w=;char ch=;
  12. while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
  13. while(ch>=''&&ch<='')X=(X<<)+(X<<)+ch-'',ch=getchar();
  14. return X*w;
  15. }
  16. int f[T][N][N],qx[N],qy[N];
  17. char s[N];
  18. bool ok[N][N];
  19. int dx[]={,-,,,};
  20. int dy[]={,,,-,};
  21. struct time{
  22. int t,d;
  23. }p[T];
  24. int n,m;
  25. void dp(int x,int y,int k){
  26. int l=,r=;
  27. while(x>=&&y>=&&x<=n&&y<=m){
  28. while(l<r&&abs(x-qx[l])+abs(y-qy[l])>p[k].t)l++;
  29. while(l<r&&!ok[x][y])r--;
  30. while(l<r){
  31. int t1=f[k-][qx[r-]][qy[r-]]+abs(x-qx[r-])+abs(y-qy[r-]);
  32. int t2=f[k-][x][y];
  33. if(t1<t2)r--;
  34. else break;
  35. }
  36. if(ok[x][y]){
  37. qx[r]=x,qy[r++]=y;
  38. f[k][x][y]=f[k-][qx[l]][qy[l]]+abs(x-qx[l])+abs(y-qy[l]);
  39. }
  40. x+=dx[p[k].d];y+=dy[p[k].d];
  41. }
  42. }
  43. int main(){
  44. n=read(),m=read();
  45. int x=read(),y=read(),t=read();
  46. for(int i=;i<=n;i++){
  47. scanf("%s",s+);
  48. for(int j=;j<=m;j++)ok[i][j]=(s[j]=='.');
  49. }
  50. memset(f,-,sizeof(f));
  51. f[][x][y]=;
  52. for(int i=;i<=t;i++){
  53. int t1=read(),t2=read();
  54. p[i].t=t2-t1+;p[i].d=read();
  55. }
  56. for(int k=;k<=t;k++){
  57. if(p[k].d==)
  58. for(int j=;j<=m;j++)dp(n,j,k);
  59. if(p[k].d==)
  60. for(int j=;j<=m;j++)dp(,j,k);
  61. if(p[k].d==)
  62. for(int i=;i<=n;i++)dp(i,m,k);
  63. if(p[k].d==)
  64. for(int i=;i<=n;i++)dp(i,,k);
  65. }
  66. int ans=;
  67. for(int i=;i<=n;i++){
  68. for(int j=;j<=m;j++){
  69. ans=max(ans,f[t][i][j]);
  70. }
  71. }
  72. printf("%d\n",ans);
  73. return ;
  74. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ1499:[NOI2005]瑰丽华尔兹——题解的更多相关文章

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

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

  2. [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]

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

  3. BZOJ1499 [NOI2005]瑰丽华尔兹 【单调队列优化dp】

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

  4. BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)

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

  5. bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp

    这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...

  6. BZOJ1499: [NOI2005]瑰丽华尔兹(dp)

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

  7. bzoj1499: [NOI2005]瑰丽华尔兹

    dp. 首先我们可以看到每个时间段只能往一个方向转移最多t步(t为时间段的长度),所以我们可以按时间段dp.因为这个前后值互不影响,也不用占用这一维空间就可以省去. 然后每个时间段内是一列一列(行) ...

  8. bzoj千题计划216:bzoj1499: [NOI2005]瑰丽华尔兹

    http://www.lydsy.com/JudgeOnline/problem.php?id=1499 预处理从每个位置向每个方向最多能走几步 dp[k][i][j] 第k个时间段后,钢琴到位置(i ...

  9. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

随机推荐

  1. vim 安装

    Ubuntu 16.04 下 Vim安装及配置 默认已经安装了VIM-tiny linuxidc@linuxidc:~$ locate vi | grep 'vi$' |xargs ls -al lr ...

  2. spl_autoload_register()函数

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php <?php class PRINTI ...

  3. yield学习

    如果要控制内存占用,最好不要用list来保存中间结果,而是通过iterable对象(range, xrange, generator等)来迭代.   yield 使函数变为generator,返回对象 ...

  4. JMeter自学笔记2-图形界面介绍

    一.写在前面的话: 上篇我们已经学会了如何安装JMeter和打开JMeter,那么这篇我们将对JMeter的图形界面做一个简单的介绍.大家只要简单的了解即可,无需死记硬背,在今后的学习和使用中慢慢熟悉 ...

  5. HDU 1232 并查集板子题

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  6. 【C#】ArcFace2 视频人脸比对教程

    请允许我大言不惭,叫做教程,特希望各位能指正.哦,我用的是vs2017.了解更多详情可以访问虹软人工智能开放平台 一.准备工作 1.创建项目 2.添加EMGU.CV包 ,并设属性“复制到输出目录”为“ ...

  7. js随机数算法

    function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...

  8. Thunder团队——事后诸葛亮会议

    小组名称:Thunder 项目名称:爱阅APP 小组成员:王航 李传康 代秋彤 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞 一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型 ...

  9. c# 有无符号值进一步了解

    1.编写过程中用到了short类型(有符号型,值范围含负值).两个正数之和得负. 改为int或unsigned short 均可. 2.注意,short型(-32768,32767)举例:做自加运算, ...

  10. 3dContactPointAnnotationTool开发日志(十四)

      貌似每次让用户手动输入文件路径太不人道了,于是参考Unity 实用教程 之 调用系统窗口选择文件或路径增加了让用户浏览文件的功能,点击输入框旁边的+就可以找到文件并加载进来:   貌似调整位置再计 ...