华为OD机试 - 跳格子3 - 动态规划(Java 2024 C卷 200分)

发布于:2024-04-27 ⋅ 阅读:(27) ⋅ 点赞:(0)

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

小明和朋友们一起玩跳格子游戏,

每个格子上有特定的分数 score = [1, -1, -6, 7, -17, 7],

从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点 score[n-1] 时,能得到的最大得分。

二、输入描述

第一行输入总的格子数量 n

第二行输入每个格子的分数 score[i]

第三行输入最大跳的步长 k

三、输出描述

输出最大得分

备注:

  1. 格子的总长度 n 和步长 k 的区间在 [1, 100000]
  2. 每个格子的分数 score[i] 在 [-10000, 10000] 区间中

1、输入

6
1 -1 -6 7 -17 7
2

2、输出

14

3、说明

输出最大得分数,小明从起点score[0]开始跳,第一次跳score[1],第二次跳到score[3],第三次跳到score[5],因此得到的最大的得分是score[0] + score[1] + score[3] + score[5] = 14

四、解题思路

这个问题可以通过动态规划的方法来解决。

在这种方法中,我们将定义一个 dp 数组,其中 dp[i] 表示到达第 i 个格子时能得到的最大得分。我们将利用步长限制 k,从前 k 个可能的格子中选择最大得分的路径来更新 dp[i]。

解题步骤:

  1. 创建一个数组 dp,大小为 n(格子数量),初始化 dp[0] = score[0](因为游戏从第一个格子开始)。
  2. 对于 dp[i](i从1到n-1),计算从 max(0, i-k) 到 i-1(即前k个可能的格子)中能得到的最大得分加上当前格子的得分 score[i]。
  3. 最终,dp[n-1] 将包含到达最后一个格子时的最大得分。

五、Java算法源码

public class Test05 {
    /**
     * 每个格子上有特定的分数 score = [1, -1, -6, 7, -17, 7],
     * 从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点 score[n-1] 时,能得到的最大得分。
     */
	public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取格子数量
        int[] score = new int[n];
        for (int i = 0; i < n; i++) {
            score[i] = scanner.nextInt(); // 读取每个格子的得分
        }
        int k = scanner.nextInt(); // 读取最大步长
        System.out.println(maxScore(n, score, k)); // 输出最大得分
    }
    
    public static int maxScore(int n, int[] score, int k) {
        if (n == 0) return 0;
        int[] dp = new int[n];
        dp[0] = score[0]; // 从第一个格子开始,初始化第一个格子的得分

        // 动态规划计算到达每个格子的最大得分
        for (int i = 1; i < n; i++) {
            int maxPrevScore = Integer.MIN_VALUE; // 初始化为极小值,寻找最大的得分
            // 计算能跳到当前格子i的前k个格子的最大得分
            for (int j = 1; j <= k; j++) {
                if (i - j >= 0) {
                    maxPrevScore = Math.max(maxPrevScore, dp[i - j]);
                }
            }
            // 更新到达当前格子的最大得分
            dp[i] = score[i] + (maxPrevScore != Integer.MIN_VALUE ? maxPrevScore : 0);
        }

        // 最后一个格子的得分就是答案
        return dp[n - 1];
    }
}

通过动态规划方法计算了在给定步长限制下跳格子游戏的最大得分。通过逐一考虑每个可能的前置位置并选择最优的得分累加方式,确保了每一步都是基于之前得到的最佳结果。这种方法有效地解决了问题,即使在面对较大的 n 和 k 时也能高效运行。

六、效果展示

1、输入

6
1 -1 -6 7 -17 7
2

2、输出

14

3、说明

输出最大得分数,小明从起点score[0]开始跳,第一次跳score[1],第二次跳到score[3],第三次跳到score[5],因此得到的最大的得分是score[0] + score[1] + score[3] + score[5] = 14

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述