2024华为OD机试真题目录-(B卷C卷D卷)-【C++ Java Python】
题目描述
小明和朋友们一起玩跳格子游戏,
每个格子上有特定的分数 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
输入
6
1 -1 -6 7 -17 7
2
输出
14
说明
无
题目解析
本题可以用动态规划进行解答,dp[i]表示到达第i个格子能获得的最大分数,转移方程为dp[i]=max(dp[i-1],dp[i-2],...,dp[i-k])+score[i]。因此,本题的关键在于如何求出k个连续数中的最大值,可以使用滑窗法进行求解。
代码
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k;
cin>>n;
vector<int> vec(n);
for(int i=0;i<n;i++) {
cin>>vec[i];
}
cin>>k;
//dp[0]等于vec[0]本身
vector<int> dp(n,0);
dp[0]=vec[0];
//使用单调队列滑窗求k个数中的最大值
deque<int> que;
que.push_back(dp[0]);
//当窗口长度不足k时,无需滑动窗口
for(int i=1;i<min(n,k+1);i++) {
dp[i]=que.front()+vec[i];
while(que.size()>0 && que.back()<=dp[i]) {
que.pop_back();
}
que.push_back(dp[i]);
}
//当窗口长度达到k时,需要移动窗口,弹出队列中不在窗口中的数
for(int i=k+1;i<n;i++) {
if(que.front()==dp[