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

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务