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]);
OD统一考试(C卷)分值:&nbsp;200分题解:&nbsp;Java&nbsp;/&nbsp;Python&nbsp;/&nbsp;C++题目描述小明和朋友们一起玩跳格子游戏,每个格子上有特定的分数&nbsp;score&nbsp;=&nbsp;[1,&nbsp;-1,&nbsp;-6,&nbsp;7,&nbsp;-17,&nbsp;7],从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点&nbsp;score[n-1]&nbsp;时,能得到的最大得分。输入描述第一行输入总的格子数量&nbsp;n第二行输入每个格子的分数&nbsp;score[i]第三行输入最大跳的步长&nbsp;k输出描述输出最大得分备注格子的总长度&nbsp;n&nbsp;和步长&nbsp;k&nbsp;的区间在&nbsp;[1,&nbsp;100000]每个格子的分数&nbsp;score[i]&nbsp;在&nbsp;[-10000,&nbsp;10000]&nbsp;区间中示例1输入: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题解这道题是一个典型的动态规划问题。解题思路如下:创建一个数组 dp,其中 dp[i]&nbsp;表示跳到&nbsp;score[i-1]&nbsp;时能得到的最大得分。使用大顶堆(或者优先队列)来维护前 k&nbsp;个最大的&nbsp;dp&nbsp;值,以便在每一步更新&nbsp;dp[i]&nbsp;时能够找到前&nbsp;k&nbsp;个最大值。从左到右遍历格子,更新 dp[i+1]&nbsp;的值。具体更新方式为当前格子的分数加上前&nbsp;k&nbsp;个最大的&nbsp;dp&nbsp;值。输出 dp[n],即跳到终点时的最大得分。Javaimport&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;PriorityQueue&lt;&gt;((a,&nbsp;b)&nbsp;-&gt;&nbsp;Integer.compare(b[0],&nbsp;a[0]));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.offer(new&nbsp;int[]{dp[0],&nbsp;-1});&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;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;移除窗口范围之外的元素&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!heap.isEmpty()&nbsp;&amp;&amp;&nbsp;i&nbsp;-&nbsp;heap.peek()[1]&nbsp;&gt;&nbsp;k)&nbsp;heap.poll();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;heap.peek()[0]&nbsp;堆顶元素即为&nbsp;dp[i]&nbsp;前&nbsp;k&nbsp;个最大的&nbsp;max(dp[i-1],&nbsp;dp[i-2],&nbsp;...&nbsp;,&nbsp;dp[i&nbsp;-&nbsp;k])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i&nbsp;+&nbsp;1]&nbsp;=&nbsp;score[i]&nbsp;+&nbsp;heap.peek()[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.offer(new&nbsp;int[]{dp[i&nbsp;+&nbsp;1],&nbsp;i});&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(dp[n]);&nbsp;&nbsp;&nbsp;&nbsp;}}Pythonfrom&nbsp;math&nbsp;import&nbsp;inffrom&nbsp;heapq&nbsp;import&nbsp;heappush,&nbsp;heappopn&nbsp;=&nbsp;int(input())score&nbsp;=&nbsp;list(map(int,&nbsp;input().split()))k&nbsp;=&nbsp;int(input())#&nbsp;dp[i]&nbsp;表示跳到&nbsp;score[i-1]&nbsp;能得到的最大得分dp&nbsp;=&nbsp;[-inf]&nbsp;*&nbsp;(n&nbsp;+&nbsp;1)dp[0]&nbsp;=&nbsp;0#&nbsp;大顶堆实现:&nbsp;存入时将数据转负数,取用的时候再转换过来。#&nbsp;堆中的元素:&nbsp;&nbsp;(跳到第i步最大得分,&nbsp;下标i)h&nbsp;=&nbsp;[]heappush(h,&nbsp;(-dp[0],&nbsp;-1))for&nbsp;i,&nbsp;s&nbsp;in&nbsp;enumerate(score):&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;h&nbsp;and&nbsp;i&nbsp;-&nbsp;h[0][1]&nbsp;&gt;&nbsp;k:&nbsp;&nbsp;#&nbsp;移除窗口范围之外的元素&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heappop(h)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;-h[0][0]&nbsp;堆顶元素即为&nbsp;dp[i]&nbsp;前&nbsp;k&nbsp;个最大的&nbsp;max(dp[i-1],&nbsp;dp[i-2],&nbsp;...&nbsp;,&nbsp;dp[i&nbsp;-&nbsp;k])&nbsp;&nbsp;&nbsp;&nbsp;dp[i+1]&nbsp;=&nbsp;s&nbsp;-&nbsp;h[0][0]&nbsp;&nbsp;&nbsp;&nbsp;heappush(h,&nbsp;(-dp[i+1],&nbsp;i))print(dp[-1])C++#include&nbsp;&lt;iostream&gt;#include&nbsp;&lt;vector&gt;#include&nbsp;&lt;queue&gt;using&nbsp;namespace&nbsp;std;int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;n,&nbsp;k;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;int&gt;&nbsp;score(n);&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;cin&nbsp;&gt;&gt;&nbsp;score[i];&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;k;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dp[i]&nbsp;表示跳到&nbsp;score[i-1]&nbsp;能得到的最大得分&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;int&gt;&nbsp;dp(n&nbsp;+&nbsp;1,&nbsp;INT_MIN);&nbsp;&nbsp;&nbsp;&nbsp;dp[0]&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;大顶堆实现,&nbsp;堆中的元素:&nbsp;&nbsp;{跳到第i步最大得分,&nbsp;下标i}&nbsp;&nbsp;&nbsp;&nbsp;priority_queue&lt;pair&lt;int,&nbsp;int&gt;&gt;&nbsp;heap;&nbsp;&nbsp;&nbsp;&nbsp;heap.push({dp[0],&nbsp;-1});&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;移除窗口范围之外的元素&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!heap.empty()&nbsp;&amp;&amp;&nbsp;i&nbsp;-&nbsp;heap.top().second&nbsp;&gt;&nbsp;k)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.pop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;heap.top().first&nbsp;堆顶元素即为&nbsp;dp[i]&nbsp;前&nbsp;k&nbsp;个最大的&nbsp;max(dp[i-1],&nbsp;dp[i-2],&nbsp;...&nbsp;,&nbsp;dp[i&nbsp;-&nbsp;k])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[i&nbsp;+&nbsp;1]&nbsp;=&nbsp;score[i]&nbsp;+&nbsp;heap.top().first;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.push({dp[i&nbsp;+&nbsp;1],&nbsp;i});&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;dp[n]&nbsp;&lt;&lt;&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}相关练习题🙏整理题解不易,&nbsp;如果有帮助到您,请给点个赞&nbsp;‍❤️‍&nbsp;和收藏&nbsp;⭐,让更多的人看到。🙏🙏🙏
点赞 7
评论 2
全部评论

相关推荐

07-01 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 15:39
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务