设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子

转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就中断

转移过程可以用单调非递增的双端队列优化

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 ;
 const int inf=0x3f3f3f3f;

 ][maxN][maxN];
 char map[maxN][maxN];
 int deqv[maxN];
 int deqn[maxN];
 int head,tail;
 int N,M,x,y,K;

 inline void resetDeq()
 {
     head=-; tail=;
 }

 inline void popDeq(int n,int len)
 {
     if(tail<head && n-deqn[tail]>len) ++tail;
 }

 inline void pushDeq(int v,int n)
 {
     while(head>=tail && v>deqv[head]) --head;
     deqv[++head]=v; deqn[head]=n;
 }

 inline int maxDeq()
 {
     if(head>=tail) return deqv[tail];
     else return -inf;
 }

 int main()
 {
     scanf("%d%d%d%d%d",&N,&M,&x,&y,&K);
     ;i<=N;i++) scanf();

     memset(dp,0xc0,sizeof(dp));
     dp[][x][y]=;

     int s,t,dir;
     int len;
     while(K--)
     {
         scanf("%d%d%d",&s,&t,&dir);
         len=t-s+;

         )
             ;i<=N;i++)
             {
                 resetDeq();
                 ;j<=M;j++)
                 {
                     if(map[i][j]=='.')
                     {
                         popDeq(j,len);
                         dp[][i][j]=std::max(dp[][i][j],maxDeq()+j);
                         pushDeq(dp[][i][j]-j,j);
                     }
                     ][i][j]=-inf; }
                 }
             }
         )
             ;i<=N;i++)
             {
                 resetDeq();
                 for(int j=M;j;j--)
                 {
                     if(map[i][j]=='.')
                     {
                         popDeq(M-j,len);
                         dp[][i][j]=std::max(dp[][i][j],maxDeq()+M-j);
                         pushDeq(dp[][i][j]-M+j,M-j);
                     }
                     ][i][j]=-inf; }
                 }
             }
         )
             ;j<=M;j++)
             {
                 resetDeq();
                 ;i<=N;i++)
                 {
                     if(map[i][j]=='.')
                     {
                         popDeq(i,len);
                         dp[][i][j]=std::max(dp[][i][j],maxDeq()+i);
                         pushDeq(dp[][i][j]-i,i);
                     }
                     ][i][j]=-inf; }
                 }
             }
         )
             ;j<=M;j++)
             {
                 resetDeq();
                 for(int i=N;i;i--)
                 {
                     if(map[i][j]=='.')
                     {
                         popDeq(N-i,len);
                         dp[][i][j]=std::max(dp[][i][j],maxDeq()+N-i);
                         pushDeq(dp[][i][j]+i-N,N-i);
                     }
                     ][i][j]=-inf; }
                 }
             }
         memcpy(dp[],dp[],]));
     }

     int ans=-inf;
     ;i<=N;i++)
         ;j<=M;j++)
             ans=std::max(ans,dp[][i][j]);
     printf("%d\n",ans);
     ;
 }

Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化的更多相关文章

  1. poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)

    /** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...

  2. 关于SPFA的双端队列优化

    7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...

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

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

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

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

  5. 洛谷 P2254 [NOI2005]瑰丽华尔兹(单调栈优化DP)

    题目描述 不妨认为舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长.每个时刻,钢琴都会随 ...

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

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

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

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

  8. 洛谷P2254 [NOI2005]瑰丽华尔兹(单调队列)

    传送门 题解 大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离 然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][ ...

  9. LuoguP2254 [NOI2005]瑰丽华尔兹 (单调队列优化DP)(用记忆化过了。。。)

    记忆化 #include <cstdio> #include <iostream> #include <cstring> #include <algorith ...

随机推荐

  1. (转载)linux中shell变量

    (转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...

  2. dotfuscator使用方法

    dotfuscator如何对.net程序进行混淆保护对于程序代码的保护,网上有很多资料,有的说混淆,有的说加密,我比较支持混淆的方法,这样可以让反编译劳工,头晕一阵子,哈哈开玩笑.对于加密如果不是不得 ...

  3. CSU 1507 超大型LED显示屏 第十届湖南省赛题

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1507 解题思路:这是一道模拟题,看了那么多人的代码,我觉得我的代码是最简的,哈哈,其实就 ...

  4. 【内部竞聘】华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz!

    [内部竞聘]华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz! [内部竞聘]华东/华南 -区域招商高级经理/经理   [复制链接]     ...

  5. JavaEE学习笔记---数据库操作篇

    测试JDBC和SQLServer的插入操作,源码如下: import java.sql.Connection;import java.sql.DriverManager;import java.sql ...

  6. test、exec、match区别

    test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = ...

  7. C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏

    1.     概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...

  8. ssl https服务 需要 php5.3以上

    php 5.2 升级 5.3 http://wdlinux.cn/bbs/viewthread.php?tid=37512&highlight=5.3 默认的升级不支持 pdo 升级前编辑升级 ...

  9. Kruskal算法模拟讲解

    Kruskal 算法是一个求最小生成树的算法,即求最小的开销等 算法可以这样,要求得最小生成树,那么n个节点只能包括n-1条边 所以我们应该转换为寻找这最短的n-1条边,因此,可以先对所有的 边进行从 ...

  10. [PWA] 19. Cache the avatars

    Cache the avatars is little different from cache photos. We need to serve the page with our cache da ...