[GESP202312 六级] 闯关游戏

题目描述

你来到了一个闯关游戏。

这个游戏总共有 N N N 关,每关都有 M M M 个通道,你需要选择一个通道并通往后续关卡。其中,第 i i i 个通道可以让你前进 a i a_i ai 关,也就是说,如果你现在在第 x x x 关,那么选择第 i i i 个通道后,你将直接来到第 x + a i x+a_i x+ai 关(特别地,如果 x + a i ≥ N x + a_i \geq N x+aiN,那么你就通关了)。此外,当你顺利离开第 s s s 关时,你还将获得 b s b_s bs 分。

游戏开始时,你在第 0 0 0 关。请问,你通关时最多能获得多少总分。

输入格式

第一行两个整数 N N N M M M,分别表示关卡数量和每关的通道数量。

接下来一行 M M M 个用单个空格隔开的整数 a 0 , a 1 ⋯ , a M − 1 a_0,a_1\cdots,a_{M-1} a0,a1,aM1。保证 1 ≤ a i ≤ N 1\le a_i \le N 1aiN

接下来一行 N N N 个用单个空格隔开的整数 b 0 , b 1 ⋯ , b N − 1 b_0,b_1\cdots,b_{N-1} b0,b1,bN1。保证 ∣ b i ∣ ≤ 1 0 5 |b_i|\le 10^5 bi105

输出格式

一行一个整数,表示你通关时最多能够获得的分数。

输入输出样例 #1

输入 #1

6 2 
2 3
1 0 30 100 30 30

输出 #1

131

输入输出样例 #2

输入 #2

6 2
2 3
1 0 30 100 30 -1

输出 #2

101

说明/提示

样例解释 1

你可以在第 0 0 0 关选择第 1 1 1 个通道,获得 1 1 1 分并来到第 3 3 3 关;随后再选择第 0 0 0 个通道,获得 100 100 100 分并来到第 5 5 5 关;最后任选一个通道,都可以获得 30 30 30 分并通关。如此,总得分为 1 + 100 + 30 = 131 1+100+30=131 1+100+30=131

样例解释 2

请注意,一些关卡的得分可能是负数。

数据范围

对于 20 % 20\% 20% 的测试点,保证 M = 1 M=1 M=1

对于 40 % 40\% 40% 的测试点,保证 N ≤ 20 N \le 20 N20;保证 M ≤ 2 M\le 2 M2

对于所有测试点,保证 1 ≤ N ≤ 1 0 4 1 \le N \le 10^4 1N104;保证 1 ≤ M ≤ 100 1 \le M\le 100 1M100

提交链接

闯关游戏

解析

搜索的想法(40分)

深度优先搜索(DFS) 来枚举所有可能的路径,以找到通关时的最高得分。

主要逻辑

  1. dfs(pos, score)
  • pos 代表当前关卡编号
  • score 代表目前的累计得分
  • 递归终止条件:当 pos >= n(即通关)时,更新 mx 记录的最大得分。
  • 否则,尝试 m 种通道,每种都递归调用 dfs(pos + a[i], score + b[pos])
  1. main()
  • 读取输入 N N N, M M M(关卡数和通道数)。
  • 读取每个通道的跳跃距离 a [ i ] a[i] a[i]
  • 读取每一关的得分 b [ i ] b[i] b[i]
  • 调用 dfs(0, 0)0 关开始搜索所有可能的通关路径。

时间复杂度分析

最坏情况分析:在最坏情况下,DFS 会搜索所有可能的通关路径。

状态树的深度

  • 最深可能达到 N N N(最坏情况下一次只前进 1 1 1 关)。

每层的分支数

  • 每一层最多有 M M M 个选择(每一关有 M M M 个通道)。

搜索空间

  • 递归构成了一棵 最大深度 N N N,每个节点最多 M M M 个子节点 的搜索树。
  • 这样搜索树的节点数最多是 M N M^N MN(指数级别)。

对于 40 % 40\% 40% 的测试点,保证 N ≤ 20 N \le 20 N20;保证 M ≤ 2 M\le 2 M2,时间复杂度可以承受。

参考代码:

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e4 + 9;int n, m, a[109], b[MAX_N], mx = -1e9;  //mx初值为一个比较小的数(分数有负数存在)int cost[10009];void dfs(int pos, int score)
{if (pos >= n){mx = max(mx, score);return;}for (int i = 0; i < m; i++)dfs(pos + a[i], score + b[pos]);
}
int main()
{cin >> n >> m; // 关卡的数量  每一关的通道数量for (int i = 0; i < m; i++)cin >> a[i]; // 第i个通道前进a[i]关for (int i = 0; i < n; i++)cin >> b[i]; // 通过第i关时获得的分数为b[i]dfs(0, 0);cout << mx;return 0;
}

动态规划的想法(100分)

动态规划(DP) 来代替深度优先搜索。动态规划能避免递归树的指数级别增长,优化到 O ( N ∗ M ) O(N*M) O(NM) 的复杂度。

使用一个一维 d p dp dp 数组来表示从第 x x x 关卡到达时的最大得分。然后通过迭代的方式,更新每个关卡的得分。

动态规划思路:

状态定义:

  • d p [ x ] dp[x] dp[x] 表示到达 x x x 关时的最大得分。

状态转移:

  • 从关卡 x x x 选择任意通道 i i i,到达 x + a [ i ] x + a[i] x+a[i] 关,得分更新为 d p [ x + a [ i ] ] = m a x ( d p [ x + a [ i ] ] , d p [ x ] + b [ x ] ) dp[x + a[i]] = max(dp[x + a[i]], dp[x] + b[x]) dp[x+a[i]]=max(dp[x+a[i]],dp[x]+b[x])

初始化:

  • d p [ 0 ] = 0 dp[0] =0 dp[0]=0(从第 0 0 0 关开始)。

目标:

  • 最终我们希望到达的关卡 ≥ n ≥n n,表示最后能通关时的最高得分。每一个 a [ i ] a[i] a[i] 最大为 n n n,我们可以求 d p [ n ] ∼ d p [ 2 ∗ n ] dp[n] \sim dp[2*n] dp[n]dp[2n] 的最大值即可。

参考代码:

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e4 + 9;int n, m, a[109], b[MAX_N], mx = -1e9;
int dp[2 * MAX_N]; // dp[i]:到达第i个关卡的最大分数int main()
{cin >> n >> m; // 关卡的数量  每一关的通道数量for (int i = 1; i <= 2 * n; i++)dp[i] = -1e9;for (int i = 0; i < m; i++)cin >> a[i]; // 第i个通道前进a[i]关for (int i = 0; i < n; i++)cin >> b[i]; // 通过第i关时获得的分数为b[i]for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)dp[i + a[j]] = max(dp[i + a[j]], dp[i] + b[i]);for (int i = n; i <= 2 * n; i++)mx = max(mx, dp[i]);cout << mx;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Google文档导入WordPress:简单实用的几种方法

Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作&#xff0c;并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时&#xff0c;可能会遇到一些小麻烦&#xff0c;比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…

java面试场景问题

还在补充&#xff0c;这几天工作忙&#xff0c;闲了会把答案附上去&#xff0c;也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1&#xff1a;基于唯一请求 ID&#xff08;幂等 Token&#xff09; 思路&#xff1a;前端生成 一个唯一的 requestId&#xff08;…

【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)

【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数&#xff1b;双目运算符代表有两个操作数&#xff0c;如逻辑运算符就是双目运算符&#xff1b;弹幕运算符代表有一个操作数&a…

GAMES101-现代计算机图形学入门笔记

主讲老师&#xff1a;闫令琪&#xff0c;此处仅做个人笔记使用。如果我的分享对你有帮助&#xff0c;请记得点赞关注不迷路。 课程链接如下&#xff1a;GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili 课程分为四部分&#xff1a;光栅化、几何、光线追踪、模拟 图形…

激光工控机在自动化生产线中有什么关键作用?

激光工控机作为自动化生产线的核心设备&#xff0c;通过高精度控制、快速响应和智能化集成&#xff0c;在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析&#xff1a; 一、实现高效连续生产&#xff1a; 1.高速加工能力&#xff1…

高等数学(上)题型笔记(六)定积分的应用

目录 1 三角函数定积分的结论 2 定积分的微元法&#xff08;元素法&#xff09; 2.1 使用条件 2.2 使用步骤 3 定积分的几何应用 3.1 平面图形的面积 3.1.1 直角坐标系的情形 3.1.1.1 X型 3.1.1.2 Y型 3.1.1.3 双型 3.1.1.4 复合&#xff1a;分割型 3.1.1.5 引入参…

QT项目——天气预报

文章目录 前言一、项目介绍二、项目基础知识1. 软件开发网络通信架构1.1 CS架构 / BS架构1.1.1 CS架构&#xff08;客户端-服务器架构&#xff09;1.1.2 BS架构&#xff08;浏览器-服务器架构&#xff09; 1.2 HTTP 基本概念 2. QT 下 HTTP 编程2.1 类的解析2.2 示例程序 3. JS…

最优化方法-牛顿法

牛顿法 泰勒级数 泰勒级数展开 $$ \begin{aligned} f(x)&\lim\limits_{n\rightarrow \infin}\sum\limits_{i1}n\frac{1}{n!}f{(n)}(x_0)(x-x_0)^n\ &f(x_0)f’(x_0)(x-x_0)\frac{f’(x_0)}{2!}(x-x_0)2\cdots\frac{1}{n!}fn(x_0)(x-x_0)^n\ &\quad~ O\left[(x-x_…

论文笔记(七十二)Reward Centering(二)

Reward Centering&#xff08;二&#xff09; 文章概括摘要2 简单的奖励中心 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…

MySQL修改JSON格式数据示例

最近发现有个数据是用JSON格式直接存到表格里面的&#xff0c;大概就是下面这样的 然后需要修改里面某个属性的值&#xff0c;一开始我想的是 REPLACE 替换 UPDATE test_1 SET content REPLACE(content, {"age": 15, "name": "w5"}, {"ag…

第4章 信息系统架构(二)

4.2 系统架构 信息系统架构是一种体系结构&#xff0c;它反映了一个组织信息系统的各个组成部分之间的关系&#xff0c;以及信息系统与相关业务、信息系统与相关技术之间的关系。 4.2.1 架构定义 对于大规模的复杂系统来说&#xff0c;对总体的系统结构设计比起对计算算法和…

AI 时代:探索大语言模型与核心技术

引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正成为推动创新和变革的重要力量。从能够理解和生成自然语言的大语言模型&#xff08;LLM&#xff09;&#xff0c;到具有自我学习能力的生成式预训练转换器&#xff08;GPT&#xff09;&#xf…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…

10、k8s对外服务之ingress

service和ingress的作用 service的作用 NodePort&#xff1a;会在每个节点开放一个端口&#xff0c;端口号30000-32767。 也是只能用于内网访问&#xff0c;四层转发。实现负载均衡。不能基于域名进行访问。 clusterip&#xff1a;service的默认类型&#xff0c;只能在集群…

Linux-ubuntu系统移植之Uboot启动流程

Linux-ubuntu系统移植之Uboot启动流程 一&#xff0c;Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&…

H3C交换机路由器防火墙FTP/TFTP服务器搭建。

软件介绍。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多种网络服务功能的工具软件&#xff0c;主要用于网络管理和文件传输&#xff0c;支持TFTP、FTP、Syslog等多种协议&#xff0c;广泛应用于网络设备的配置和管理。 1. 主要功能 TFTP服务器&#xff1a;支持TFTP协议…

Docker Mysql 数据迁移

查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…

[Windows] WPS 2024冬季更新版(版本号19770)

[Windows] WPS 2024冬季更新版 链接&#xff1a;https://pan.xunlei.com/s/VOJQrS4UCz5639Oan7pu1X84A1?pwdg8ad# WPS灵犀正式上线DeepSeek R1&#xff01;告别服务器超时&#xff0c;办公效率飙升300%&#xff01; 2025年2月14日&#xff0c;WPS官方宣布全面接入DeepSeek …

图解循环神经网络(RNN)

目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同&#xff0c…