2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解

贾蔷
• 阅读 3

2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解 一、题目解读 本文针对2023年GESP六级题目“闯关游戏”(洛谷P10108)进行详细解析。题目要求玩家通过不同关卡路径选择,计算从起点到终点的最大得分。关卡间存在跳跃规则,需结合动态规划思想设计高效算法,最终输出最优得分。

二、解题思路 采用动态规划(Dynamic Programming)策略。核心思路为:

  1. 逆向求解:从终点反向推算每关的最大得分,避免路径重复计算。

  2. 状态定义:dp[i]表示从第i关到终点的最大得分,边界条件dp[N]=0(终点得分为0)。

  3. 状态转移:遍历每关可选跳跃步数a[i],计算下一关得分dp[next] + 当前关得分b[i],取最大值更新dp[x]。

三、解题步骤拆解

  1. 输入与初始化:读入关卡数N、跳跃规则数M,存储跳跃步数a[]与关卡得分b[]。

  2. 动态规划核心逻辑:

从N-1关开始逆向循环,避免依赖后续状态。

遍历每个跳跃规则,计算可达下一关索引next。

若next关得分已计算(dp[next]有效),更新当前dp[x]为max(dp[next] + b[x])。

  1. 输出结果:最终dp[0]即为起点到终点的最大得分。

四、代码与注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(false); // 加速输入输出
    cin.tie(nullptr);

    int N, M; // N:关卡数,M:跳跃规则数
    cin >> N >> M;
    vector<int> a(M), b(N); // a[]存储跳跃步数,b[]存储关卡得分
    for (int i = 0; i < M; ++i) cin >> a[i];
    for (int i = 0; i < N; ++i) cin >> b[i];

    vector<int> dp(N + 1, -1e9); // dp[i]:从第i关到终点的最大得分
    dp[N] = 0; // 终点得分初始化为0

    // 逆向动态规划
    for (int x = N - 1; x >= 0; --x) {
        int max_score = -1e9; // 临时存储当前关最大得分
        for (int i = 0; i < M; ++i) {
            int next = min(x + a[i], N); // 计算跳跃后可达的下一关(不越界)
            if (dp[next]!= -1e9) { // 若下一关得分已计算
                max_score = max(max_score, dp[next] + b[x]); // 更新当前得分
            }
        }
        dp[x] = max_score; // 更新状态
    }

    cout << dp[0] << endl; // 输出起点到终点的最大得分
    return 0;
}

五、总结 本文通过动态规划解法,高效解决了GESP六级“闯关游戏”题目。逆向计算与状态压缩避免了重复计算,适用于存在路径依赖关系的优化问题。掌握此类算法思维,可提升对复杂路径规划类题目的解题能力。 参考:GESP六级题解:洛谷P10108闯关游戏动态规划解法详解

点赞
收藏
评论区
推荐文章
Kubrnete Kubrnete
4年前
基于01背包问题的动态规划算法
目录初步认识动态规划(初步认识动态规划)与动态规划有关的理论知识:(与动态规划有关的理论知识:)动态规划中的最优决策表(基于填表的动态规划算法)最终版动态规划(最终版动态规划)总结(总结:)初步认识动态规划动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推
Wesley13 Wesley13
3年前
ACM金牌大神侯卫东老师的四步动规解题秘籍!请收下
近年来,国内外科技公司的算法面试中,动态规划几乎成了必考题型。动规题目类型众多,又没有固定的解题模板,初学者往往摸不着头脑,有时还会混淆动规和递归,所以动态规划又被称为“新人杀手”。不过动态规划的难,更多是因为初学者不知道怎么入门。学会正确的思考模式和解题流程,掌握动态规划其实并不难。九章侯卫东老师针对所有动态规划题型,总结了一套
贾蔷 贾蔷
7小时前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
7小时前
2023年GESP六级小杨握手问题(洛谷B3874):Fenwick树求解逆序对的代码解析
一、题目解读“小杨的握手问题”源自2023年GESP六级考试(对应洛谷题目B3874)。题目描述为:给定一个长度为N的排列,每次将当前数与之前未访问过的数握手,求总共握手次数。本质上是求排列中逆序对的个数,即统计每个数右侧比它小的元素数量。需设计高效算法在
贾蔷 贾蔷
7小时前
CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解
一、题目解读CSPJ2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记录,优化总费用。该问题考察对时间窗口与动态资源管理的理解,需
深度学习 深度学习
7小时前
洛谷1111题解:基于Kruskal算法与并查集的最小生成树实现
一、题目解读洛谷1111题是一道经典的图论问题,要求构建一个无向图的最小生成树,并输出其最大边权值。题目核心在于通过给定的边集合,找到连接所有节点的最小权值子集,同时保证无环。这通常涉及最小生成树算法(如Kruskal)的应用,需要高效处理边权重与节点连通
贾蔷 贾蔷
7小时前
牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)
一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历
深度学习 深度学习
7小时前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
深度学习 深度学习
7小时前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
贾蔷 贾蔷
2星期前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算