OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 小明和朋友们一起玩跳格子游戏, 每个格子上有特定的分数 score = [1, -1, -6, 7, -17, 7], 从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点 score[n-1] 时,能得到的最大得分。 输入描述 第一行输入总的格子数量 n 第二行输入每个格子的分数 score[i] 第三行输入最大跳的步长 k 输出描述 输出最大得分 备注 格子的总长度 n 和步长 k 的区间在 [1, 100000] 每个格子的分数 score[i] 在 [-10000, 10000] 区间中 示例1 输入:61 -1 -6 7 -17 72输出:14说明:输出最大得分数,小明从起点score[0]开始跳,第一次跳score[1],第二次跳到score[3],第三次跳到score[5],因此得到的最大的得分是score[0] + score[1] + score[3] + score[5] = 14 题解 这道题是一个典型的动态规划问题。解题思路如下: 创建一个数组 dp,其中 dp[i] 表示跳到 score[i-1] 时能得到的最大得分。 使用大顶堆(或者优先队列)来维护前 k 个最大的 dp 值,以便在每一步更新 dp[i] 时能够找到前 k 个最大值。 从左到右遍历格子,更新 dp[i+1] 的值。具体更新方式为当前格子的分数加上前 k 个最大的 dp 值。 输出 dp[n],即跳到终点时的最大得分。 Java import java.util.Arrays;import java.util.PriorityQueue;import java.util.Scanner;/** * @author code5bug */public class Main { 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(); // dp[i] 表示跳到 score[i-1] 能得到的最大得分 int[] dp = new int[n + 1]; Arrays.fill(dp, Integer.MIN_VALUE); dp[0] = 0; // 大顶堆实现, 堆中的元素: new int[]{跳到第i步最大得分, 下标i} PriorityQueue<int[]> heap = new Prio