这名字听起来实在有点耳熟。。?

好吧去年暑假就应该过的题。。。切了

先注意到,天使施魔法的次数不限;我们可以使得某个时刻在特定方向移动一段距离(最长的长度为那个时间段)然后怎么来考虑这个DP;

T,X,Y三维状态很好想到,刚开始的时刻是1,T-1的方向已知,要么从那个方向移动到X,Y,要么在此位置不动。现在来优化这个DP。我们的动机是把O(N*M*T)->O(N*M*K),至于为什么要这要做。。。(题感啊题感,所有的优化都是优化转移嘛不可能优化状态了,所以当转移都无法优化的时候我们只能考虑来改变这个状态。K是时间段的个数,可以想到,其实在同一时间段里面,操作几乎都是相同的。那么dp[K][X][Y]表示在K这段时间内,位于(X,Y)这个位置,从时段1到时段K的最大位移。那么转移就成为了:dp[K][X][Y]=MAX{dp[K-1][X'][Y']+DIST}

*举个例子,假如当前时间段朝向是往右,那么dp[k][x][y]=max{dp[k-1][x][y-Δy]+Δy}=y+max{dp[k-1][x][y']-y'},Δy自然要小于等于当前时间段的长度。现在转移就可以被优化了,我们把k-1时间段的状态记载下来,保证单调递减就OK了,其它三个方向也是类似的:

left:dp[k][x][y]=max{dp[k-1][x][y']+y'}-y

up:dp[k][x][y]=max(dp[k-1][x'][y]+x'}-x

down:dp[k][x][y]=max(dp[k-1][x'][y]-x'}+x

在执行队列的过程中我们有几个需要维护的地方,如果当前自己是家具,那么没关系,我们清空队列;

如果要放进的那个是不合法的,那就不放。

CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 300
using namespace std;
int n,m,x0,y0,k,ans;
][][];
];
int main()
{
    ];
    scanf("%d%d%d%d%d",&n,&m,&x0,&y0,&k);
    ;i<=n;i++)
    {
        scanf("%s",s);
        ;j<=m;j++)
         ]==;
    }
    ;i<=k;i++)scanf("%d%d%d",&st[i],&ed[i],&ff[i]);
    memset(dp,-,sizeof(dp));
    dp[][x0][y0]=;
    ;i<=k;i++)
    {
       );
       ){//向右
       ;xx<=n;xx++)
        {
          ,tail=;q[].x=dp[i-][xx][]-;q[].h=;
          ][xx][]==-)tail--;
          ;yy<=m;yy++)
          {
              while(tou<=tail&&(yy-q[tou].h>len))tou++;
              )if(tou<=tail)dp[i][xx][yy]=q[tou].x+yy;
              //if(dp[i][xx][yy]>-1)printf("you===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
              ){tail=tou-;}
              ][xx][yy+]==-)continue;
                ][xx][yy+]-yy->q[tail].x)tail--;
                tail++;q[tail].x=dp[i-][xx][yy+]-yy-;q[tail].h=yy+;
          }
        }
       }
      )//left
      {
         ;xx<=n;xx++)
         {
             ,tail=;q[].x=dp[i-][xx][m]+m;q[].h=m;
             ][xx][m]==-)tail--;
             ;yy--)
             {
                 while(tou<=tail&&q[tou].h-yy>len)tou++;
                 )if(tou<=tail)dp[i][xx][yy]=q[tou].x-yy;
                 //if(dp[i][xx][yy]>-1)printf("zuo===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
                 )tail=tou-;
                 ][xx][yy-]==-)continue;
                 ][xx][yy-]+yy->q[tail].x)tail--;
                 tail++;q[tail].x=dp[i-][xx][yy-]+yy-;q[tail].h=yy-;
             }
         }
      }
      )//向上
      {
          ;yy<=m;yy++)
          {
              ,tail=;q[].x=dp[i-][n][yy]+n;q[].h=n;
              ][n][yy]==-)tail--;
              ;xx--)
              {
                  while(tou<=tail&&q[tou].h-xx>len)tou++;
                  )if(tou<=tail)dp[i][xx][yy]=q[tou].x-xx;
                   //if(dp[i][xx][yy]>-1)printf("up===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
                  )tail=tou-;
                  ][xx-][yy]==-)continue;
                  ][xx-][yy]+xx->q[tail].x)tail--;
                  tail++;q[tail].x=dp[i-][xx-][yy]+xx-;q[tail].h=xx-;
              }
          }
      }
      )//xia
      {
          ;yy<=m;yy++)//down
          {
              ,tail=;q[].x=dp[i-][][yy]-;q[].h=;
              ][][yy]==-)tail--;
              ;xx<=n;xx++)
              {
                  while(tou<=tail&&xx-q[tou].h>len)tou++;
                  )if(tou<=tail)dp[i][xx][yy]=q[tou].x+xx;
                  //if(dp[i][xx][yy]>-1)printf("xia===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
                  )tail=tou-;
                  ][xx+][yy]==-)continue;
                  ][xx+][yy]-xx->q[tail].x)tail--;
                  tail++;q[tail].x=dp[i-][xx+][yy]-xx-;q[tail].h=xx+;
              }
          }
      }
    }
    ;i<=n;i++)
     ;j<=m;j++)
      if(dp[k][i][j]>ans)ans=dp[k][i][j];
      //printf("%d %d %d\n",i,j,dp[k][i][j]);
   printf("%d",ans);
} 

【bzoj1499】瑰丽华尔兹的更多相关文章

  1. 洛谷2254 BZOJ1499 瑰丽华尔兹题解

    洛谷链接 BZ链接 一个很容易想到的做法就是用f[i][j][t]表示t时刻在i,j处的可以滑动的最大值 f[i][j][t]=max(f[i][j][t-1],f[*i][*j][t-1]),这样大 ...

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

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

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

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

  4. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

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

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

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

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

  7. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  8. NOI2005瑰丽华尔兹

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

  9. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

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

    题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...

随机推荐

  1. HD2222 Keywords Search(AC自动机入门题)

    然而还不是很懂=_= #include <iostream> #include <cstring> #include <algorithm> #include &l ...

  2. xcode配置绝对路径与相对路径

     一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径 ...

  3. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  4. CentOS 7 上安装 redis3.2.3安装与配置

    前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自身集群的功能. 而现在最新的项目是需要redis集群的,这篇文章我们就来介绍下有关redis的安装与配置. 一. ...

  5. FireFox每次访问页面时检查最新版本

    FireFox每次访问页面时检查最新版本 浏览器都有自己的缓存机制,作为开发人员,每次js的修改都要清空缓存,显然很不方便.而firefox并没有提供ie那样的设置. 下面的方法就可以非常方便的设置f ...

  6. 大熊君{{bb}}移动开发之旅(第一季)

    一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...

  7. PHP数据采集curl常用的5个例子

    用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等.但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是 ...

  8. Java四种线程池的使用

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  9. java基本算法之冒泡排序

    冒泡排序:是一种较简单的排序算法.它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小:如果前者比后者大,则交换它们的位置.这样,一次遍历之后,最大的元素就在数列的末尾! ...

  10. MySQL学习笔记(2/2)

    SQL种类 DDL/DML/DQL/DCL 中括号[]里面的表示可选,大括号{}里面的表示必须从里面选一个,FEILED表示字段. 数据定义语言(DDL):CREATE.DROP.ALTER 用于定义 ...