D-遗迹探险

news2024/11/25 21:42:13

牛客小白月赛 72 D
题目链接
在这里插入图片描述
在这里插入图片描述
链接:https://ac.nowcoder.com/acm/contest/56825/D
来源:牛客网

示例1
输入

3 3
1 2 3
4 5 6
7 8 9
2
2
1 1
3 3
3
1 1
1 3
3 1

输出

58
41

题解:

如果先不考虑传送门,这题就是一道简单dp
设状态 d p [ i ] [ j ] dp[i][j] dp[i][j]表示到 i , j i,j i,j这个点的能获得最大的宝藏和
那么题目给出只能往下或者往右走
状态转移方程就变成了 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] + v a l [ i ] [ j ] , d p [ i ] [ j − 1 ] + v a l [ i ] [ j ] ) dp[i][j]=max(dp[i-1][j]+val[i][j],dp[i][j-1]+val[i][j]) dp[i][j]=max(dp[i1][j]+val[i][j],dp[i][j1]+val[i][j])
但要考虑传送门就复杂一些了
当时做的时候就是想不到传送门怎么解决,后续题解在下面

当时代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
    int x,y;
};
const int N = 1e3+1;
int n,m;
int a[N][N];
int dp[N][N];
int all=0;
void dfs(int x,int y){
    //no
    nullptr;
}
int vis[5];
void sove(void){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            scanf("%lld",&a[i][j]);
    }
    int t;scanf("%lld",&t);
    while(t--){
        int k;scanf("%lld",&k);
        node men[k];
        for(int i=0;i<k;i++)scanf("%lld %lld",&men[i].x,&men[i].y);
        all=0;
        //dfs(1,1);
        //dp
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]);
            }
        }
        all=max(all,dp[n][m]);
        for(int o=0;o<k;o++){
            int o2=k-o;
            if(vis[o2]==true)continue;
            vis[o2]=vis[o]=true;
            dp[men[o].x][men[o].y]=
            for(int i=men[o].x;i<=n;i++)
            {
                for(int j=men[o].y;j<=m;j++)
                    if(i>=men[o].x+1&&j>=men[o].y+1)
                    dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]);
                    else{
                        if(i==men[o].x&&j>=men[o].y+1)dp[i][j]=dp[i-1][j]+a[i][j];
                        if(j==men[o].y&&i>=men[o].x+1)dp[i][j]=dp[i][j-1]+a[i][j];
                    }
            }
            all=max(all,dp[n][m]);
        }
        
        //all=dp[n][m];
        cout<<all<<endl;
    }
}
signed main(void){
    int _=1;
    //cin>>_;
    while(_--){
        sove();
    }
    return 0;
}

题解续:

有传送门的话,我们就可以从后面的传送门传送到前面去,再拿一次宝藏
但其实题目说了,只能使用一次传送门,那么题目就没那么复杂了。
还是先来一个dp,依旧是同上述一样计算,这个算出来的 d p [ n ] [ m ] dp[n][m] dp[n][m]其实就是不用传送门的走法。
那么再反过来思考,如果在 i 1 , j 1 i_1,j_1 i1,j1处使用了传送门传送到 i 2 , j 2 i_2,j_2 i2,j2,其实就算 ( 1 , 1 ) (1,1) (1,1) ( i 1 , j 1 ) (i_1,j_1) (i1,j1)和从 ( i 2 , j 2 ) (i_2,j_2) (i2,j2) ( n , m ) (n,m) (n,m)的宝藏价值和。
所以只需要加一次反向dp,就可以计算从 ( i 2 , j 2 ) (i_2,j_2) (i2,j2) ( n , m ) (n,m) (n,m)的最大宝藏价值

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
    int x,y;
};
const int N = 2*1e3+10;
int n,m;
int a[N][N];
int dp[N][N];
int dp2[N][N];
int all=0;
void dfs(int x,int y){
    //no
    nullptr;
}
int vis[5];
void sove(void){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            scanf("%lld",&a[i][j]);
    }
    
    //dp
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i==1)dp[i][j]=dp[i][j-1]+a[i][j];
                else if(j==1)dp[i][j]=dp[i-1][j]+a[i][j];
                else
                dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]);
            }
        }
        for(int i=n;i>=1;i--){
            for(int j=m;j>=1;j--){
                if(i==n)dp2[i][j]=dp2[i][j+1]+a[i][j];
                else if(j==m)dp2[i][j]=dp2[i+1][j]+a[i][j];
                else
                dp2[i][j]=max(dp2[i+1][j]+a[i][j],dp2[i][j+1]+a[i][j]);
            }
        }
    
    int t;scanf("%lld",&t);
    while(t--){
        int k;scanf("%lld",&k);
        node men[k];
        for(int i=0;i<k;i++)scanf("%lld %lld",&men[i].x,&men[i].y);
        all=0;
        //dfs(1,1);
        all=max(all,dp[n][m]);
        for(int i=0;i<k;i++){
            for(int j=0;j<k;j++){
                if(i==j)continue;
                all=max(all,dp[men[i].x][men[i].y]+dp2[men[j].x][men[j].y]);
            }
        }
        //all=dp[n][m];
        cout<<all<<endl;
    }
}
signed main(void){
    int _=1;
    //cin>>_;
    while(_--){
        sove();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【后端随笔】mysql操作语句记录

sql语句不区分大小写 show bases&#xff1b; --号注释 /**/多行注释 DDL定义 DML删改 DQL查询 DCL权限控制语言 1、DDL操作数据库 &#xff08;1&#xff09;查询 SHOW DATABASES; (2)创建 CREATE DATABASES;//创建数据库 CREATE DATABASES IF NOT EXISTS 数据库名称&#xff…

stata学习笔记①stata基础介绍

文章目录 一、为什么要学stata二、软件基本解释1.软件界面2.导入示例数据3.认识几个重要的功能符号 三、数据的基本观测四、统计性描述1.codebook 数据字典使用2.summarize 五、图像初步探索1.histogram 直方图2.graph box /hbox 箱线图3.vioplot小提琴图 一、为什么要学stata …

JavaWeb:过滤器 Filter、监听器 Listener

文章目录 JavaWeb - 04一、Filter1. 概述2. 实现步骤3. 运行结果 二、Filter 应用&#xff1a;实现权限拦截1. 登录步骤2. 添加的过滤器部分3. 运行结果4. 总结 三、监听器注意&#xff1a; JavaWeb - 04 一、Filter 1. 概述 Filter&#xff1a;过滤器&#xff0c;可以用来过…

有用的知识又增加了:为何无法编译某些  WWDC 官方视频中的代码?

概览 作为 Apple 开发者而言&#xff0c;每期 WWDC 官方视频无疑是我们日常必看的内容。 不过&#xff0c;小伙伴们是否发现视频中有些示例代码在我们自己测试时却无法编译这一尴尬的情况呢&#xff1f; 在本篇博文中&#xff0c;我们将通过一则非常简单的示例来向大家展示为…

【Matlab】基于遗传算法的列车发车时刻(发车间隔)优化

【Matlab】基于遗传算法的列车发车时刻&#xff08;发车间隔&#xff09;优化 一、模型介绍&#xff08;一&#xff09;引言&#xff08;二&#xff09;符号定义&#xff08;三&#xff09;目标函数(四&#xff09;约束条件4.1到达乘客数量4.2乘客进站限制4.3乘客总数量&#x…

Kyligence Zen产品体验-从人找数据到数据找人

目录 前言&#xff1a; 一、什么是Kyligence Zen&#xff1f; 1、个人总结 2、官方简介 二、1分钟打开新世界大门 个人总结&#xff1a; 1、注册 2、验证登录 三、上手初体验 1、快速上手&#xff08;入门&#xff09; 2、定制化应用 四、实战体验 综述&#xff1a; 1、卡…

java transient关键字 JSON序列化问题

今天做项目的时候&#xff0c;遇到了一个奇怪的事情看图&#xff1a; 在这个JSONObject中是有这个object对象的&#xff0c;但是我输出的的却没有这个对象&#xff0c;这是怎么回事&#xff1f; 这样不明显我换一个方式去输出 我在查看了代码之后发现了我的ResponseStatus这…

数据结构-查找-树形结构(二叉排序树、二叉平衡树、红黑树、B树、B+树)查找

目录 一、二叉排序树(BST) 查询 插入 构造二叉排序树 *删除 *查找效率分析 二、二叉平衡树 *插入数据保持平衡 LL ​编辑 RR LR RL 结 *查找效率分析 删除 三、红黑树 *插入 *删除 四、B树 *插入 *删除 五、B树 一、二叉排序树(BST) 定义&#xff1a;二叉排序…

python的opencv操作记录(13)-增强之直方图均衡化

文章目录 直方图增强基本逻辑-均衡化calcHist && equalizeHistcalcHistequalizeHist 自适应直方图均衡化 前段时间忙活深度网络和android的东西去了&#xff0c;好久没讲讲传统图像处理了&#xff0c;这一篇继续来说说opencv中的传统图像处理部分——图像增强之直方图增…

【谷粒商城之订单服务-RabbitMQ延时队列】

本笔记内容为尚硅谷谷粒商城订单服务锁库存事务最终一致性部分 目录 一、RabbitMQ延时队列 二、具体实现 1、 创建上述队列和路由组件 2、解锁库存 解锁库存的两种情况 1、当订单业务提交后回滚 2、订单取消解锁库存 三、关闭订单 四、消息丢失、挤压、重复等解决方案…

c++ 继承与派生

继承就是在原有类的基础上产生新类&#xff0c;从而减少了代码重复的必要 格式&#xff1a; class A{}; class B:继承方式 A{}; 在c继承中&#xff0c;有以下几点注意 (1)基类的构造函数与析构函数不能被继承 (2)派生类对基类成员的继承没有选择权&#xff0c;不能选择继承…

c++ 常用总结(三)

1.设计模式 GitHub - FengJungle/DesignPattern: Design pattern demo code &#xff08;一&#xff09; ① 简单工厂模式 再不学简单工厂模式&#xff0c;就真的要去工厂搬砖啦~_冯Jungle的博客-CSDN博客 通过以下的例子可见&#xff0c;只需要提供产品名称作为参数&…

基于springboot+mysql+SpringDataJPA +html实现学生选课管理系统

基于springbootmysqlSpringDataJPA html实现学生选课管理系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a;4.项目需求 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 管理员&#xf…

【C++】| 03——STL | 迭代器

系列文章目录 【C】| 01——泛型编程 | 模板 【C】| 02——STL | 初识 【C】| 03——STL | 迭代器 【C】| 04——STL | 容器_vector 文章目录 1. 什么是迭代器2. 迭代器的分类3. 不同容器对应的迭代器4. 迭代器的好处5. 迭代器的操作 1. 什么是迭代器 迭代器就是指向容器内元素…

基于MATLAB的路面裂缝检测识别算法代码(GUI系统设计+图像预处理+裂缝检测)

资源地址&#xff1a; 基于MATLAB的路面裂缝检测识别算法代码&#xff08;GUI系统设计图像预处理裂缝检测&#xff09;资源-CSDN文库 主要内容&#xff1a; 1、运行Gui_Main.m程序&#xff0c;得到GUI界面 2、首先点击载入图像文件 3、后续便可以点击右侧的其他按钮进行分析…

C++linux高并发服务器项目实践 day10

Clinux高并发服务器项目实践 day10 守护进程进程组会话进程组、会话操作函数守护进程守护进程的创建步骤 线程线程和进程的区别线程之间共享和非共享资源线程操作线程创建线程退出线程参与线程分离线程取消 线程属性 守护进程 在UNIX系统中&#xff0c;用户通过终端登录系统后…

DCMM评估之战略维度沟通

01 数据战略规划过程 过程描述&#xff1a; 过程描述如下:a) 识别利益相关者,明确利益相关者的需求;b) 数据战略需求评估,组织对业务和信息化现状进行评估,了解业务和信息化对数据的需求;c) 数据战略制定,包含但不限于:1) 愿景陈述,其中包含数据管理原则、目的和目标;2) 规划…

SpringCloud 远程调用Feign、网关Gateway、配置中心Nacos、微服务架构小结、Nacos搭建集群

统一检查maven maven依赖出错的解决 注意代码格式化。因代码格式混乱&#xff0c;导致代码出错&#xff0c;pom.xml出现重复的parent标签 学习方法&#xff0c;听得懂为什么要这么做&#xff0c;要远远比 怎么做 重要的多 一、远程调用Feign 能够使用Feign进行远程调用能够…

【C++学习】创建二维动态数组

1.指针 创建二维动态数组_牛客题霸_牛客网 (nowcoder.com) 使用指针的指针 使用指针的指针可以很方便地创建动态的二维数组&#xff0c;其关键在于使用两层指针进行分配。 以下是一个动态创建n行m列的二维数组的示例代码&#xff1a; int **arr new int*[n]; // 创建一个…

深度学习训练营J2:ResNet50v2算法分析与实战

深度学习训练营J2:ResNet50v2算法分析与实战 原文链接环境介绍0.引言论文分析与解读1.ResNet50和ResNet50v2之间的结构对比2.不同结构之间的尝试 3.关于激活的不同尝试4.文章结果 ResNet50v2架构复现5.残差结构6.模块构建7.架构展示以及网络构建 8.网络结构打印ResNet50v2完整结…