首页 > 其他分享 >51nod-3983走方格

51nod-3983走方格

时间:2024-07-24 16:53:30浏览次数:13  
标签:fa 51nod int hh 方格 dx dy include 3983

https://class.51nod.com/Html/Textbook/Problem.html#problemId=3983&textbookChapterId=724

https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337

移动与时间段有关,如果按照时间段划分状态那么每一段内只有一条线性的转移。

需要一行一行或一列一列转移,故要存位置。

image-20240724164404870

接下来只需写一个函数用来用单调队列求最值,可以把点对替换掉传统的下标,传入偏移量,这样四个方向的转移只需要一个函数。

复杂度 \(o(NMK)\)。

#include<iostream>
#include<cstring>
#include<cmath>
#include<utility>
using namespace std;
const int N=210,dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int I,n,m,now,lst,x,y,k,f[2][N][N],len;
char s[N][N];
struct node{
    int x,y;
}q[N];
#define dis(a,b,c,d) (abs(d-b)+abs(c-a))
#define cdis dis(q[hh].x,q[hh].y,x,y)
void put(int b,int c,int fa,int fb){
    printf("from (%d,%d,%d)=%d\n",I-1,fa,fb,f[I-1&1][fa][fb]);
    printf("f[%d][%d][%d]=%d\n",I,b,c,f[I&1][b][c]);
}
void calc(int x,int y,int dx,int dy){
    int hh=0,tt=-1;
    for(;x>0&&y>0&&x<=n&&y<=m;x+=dx,y+=dy){
        if(s[x][y]=='x')hh=0,tt=-1;
        else{
            while(hh<=tt&&cdis>len)++hh;
            while(hh<=tt&&f[lst][q[tt].x][q[tt].y]+dis(q[tt].x,q[tt].y,x,y)
            <=f[lst][x][y])--tt;
            q[++tt]={x,y};
            if(hh<=tt)
                f[now][x][y]=f[lst][q[hh].x][q[hh].y]+cdis;//,put(x,y,q[hh].x,q[hh].y);
        }
    }
}
int main(){
    #ifdef LOCAL
    freopen("1.txt","r",stdin);
    #endif
    #ifndef LOCAL
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    #endif
    cin>>n>>m>>x>>y>>k;
    for(int i=1;i<=n;++i)cin>>(s[i]+1);
    for(int i=1;i<=n;++i)memset(f[0][i]+1,128,m*4);
    f[0][x][y]=0;
    for(I=1;I<=k;++I){
        now=I&1,lst=!now;
        for(int i=1;i<=n;++i)
            memset(f[now][i]+1,128,m*4);
        int s,t,d;
        cin>>s>>t>>d;
        len=t-s+1;
        int dx=::dx[d-1],dy=::dy[d-1];
        if(d==1)
            for(int i=1;i<=m;++i)
                calc(n,i,dx,dy);
        else if(d==2)
            for(int i=1;i<=m;++i)
                calc(1,i,dx,dy);
        else if(d==3)
            for(int i=1;i<=n;++i)
                calc(i,m,dx,dy);
        else
            for(int i=1;i<=n;++i)
                calc(i,1,dx,dy);
    }
    int ans=0;
    for(int x=1;x<=n;++x)
        for(int y=1;y<=m;++y)
            ans=max(ans,f[k&1][x][y]);
    cout<<ans;
    return 0;
}

标签:fa,51nod,int,hh,方格,dx,dy,include,3983
From: https://www.cnblogs.com/wscqwq/p/18321236

相关文章

  • uniapp [全端兼容] - 详细实现用户电子签名 “逐字校验“ 将姓名按字拆开分别手写签署
    前言如果您需要“合同专用”签字板及展示,请访问这篇文章。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成用户进行电子签名时,将其姓名进行拆分为独立的汉字,并由系统自动生成渲染对应的单个汉字文字的签名和验证笔画......
  • 美丽方格
    题目描述你手里拿着很多字母牌,在一个方格棋盘上下棋,棋盘的中心是坐标(0,0),你把字母牌在棋盘上摆放,你规定一个美丽的方格是指中心也是坐标(0,0),且方格中不存在相同字母的牌,给你一个摆放完的棋盘,问是美丽方格中最多多少张牌?思路这题第一反应是枚举正方形边长,为了方便,枚举的数是......
  • 7-3 sdut-C语言实验-骨牌铺方格
    7-3sdut-C语言实验-骨牌铺方格分数20全屏浏览切换布局作者 马新娟单位 山东理工大学斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,很多题目由此衍生而来,骨牌铺方格便是......
  • PC方格音乐v1.5.4无损音乐播放 – 一款免费无损音乐播放器
    软件介绍方格音乐(魔音Morin电脑版)是一款免费无损音乐播放器及付费歌曲无损音乐免费下载软件.方格音乐播放器采用简洁的风格设计,可以免费在线试听及下载付费歌曲,版权音乐,无损音质歌曲.方格音乐电脑版免费听歌神器支持歌曲解析功能,第三方歌单导入,歌词频谱功能,下载音乐时......
  • [数字三角形]方格取数
    设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走了两次,试找出......
  • c++踩方格-动态规划基础题
    有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;b、走过的格子立即塌陷无法再走第二次;c、只能向北、东、西三个方向走;请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同......
  • 洛谷题单指南-动态规划2-P1004 [NOIP2000 提高组] 方格取数
    原题链接:https://www.luogu.com.cn/problem/P1004题意解读:从起点走到终点,走两次,计算最大路径和,第一次走过的点数值变为0。解题思路:直观上思考,可以先从起点走到终点,计算最大路径和,并记录走过的所有点,然后把所有点的数值置为0,再从起点走到终点,计算最大路径和,把两次的最大路径......
  • 洛谷 P1004 [NOIP2000 提高组] 方格取数
    题意:n*n的方格,从左上角到右下角两次。每一次经过的路径中,如果有数字,数字都会变成0并计数。求两次路径的最大计数。思路:线性dp,从左上角到右下角步数固定为2*n-2步。初始时0步dp[0][1][1]=grid[1][1],知道了x1和x2可以确定对应的y,可以直接进行状态转移。可以增加剪枝:x<=m......
  • 【洛谷】P1004 [NOIP2000提高组]方格取数
    题目描述题目描述设有N×N 的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为......
  • PAT 2023 冬 乙 方格填数
    题目描述B-4方格填数分数20全屏浏览切换布局作者 陈越单位 浙江大学2014年哈佛-麻省理工数学竞赛中一道题是这样的:将正整数1,2,...,64填入 8×8 的方格棋盘中,使得对任何 1≤i<64,i 和 i+1 都必须填在两个具有公共边的方格中。求棋......