给你一个整数数组 arr 和一个整数 d
arr存储着一些柱子的高度,整数d为你能跳的最远距离,可以选择往左跳和往右跳
除此以外,跳跃途径中只能有更低的柱子存在
你可以选择数组的任意下标开始跳跃,请你返回你最多可以访问多少个下标
1. 排序+动态规划
class Solution {
public:
int maxJumps(vector<int>& arr, int d) {
int n = arr.size();
vector<vector<int>> temp;//用于排序,元素为存储值和坐标的二元组
vector<int> dp(n, 0); //dp[i]表示i位置最多能访问的下标
int res = 1;
for (int i = 0; i < arr.size(); i++)
temp.push_back({arr[i],i});
sort(temp.begin(), temp.end()); //从低到高排序
for (int i = 0; i < n; i++) {
int index = temp[i][1]; //编号
dp[index] = 1;//初始为1
for (int j = index - 1; j >= index - d && j >= 0; j--) {//找左边
if (arr[j] >= arr[index]) break; //被拦住直接终止
if (dp[j] != 0) dp[index] = max(dp[index], dp[j ] + 1); //根据能跳到的那个柱子,进行更新
}
for (int j = index + 1; j <= index + d && j < n; j++) {//找右边
if (arr[j] >= arr[index]) break;//被拦住直接终止
if (dp[j] != 0) dp[index] = max(dp[index], dp[j] + 1);//根据能跳到的那个柱子,进行更新
}
res = max(dp[index], res);//记录当下最大值
}
return res;
}
};
标签:index,arr,游戏,temp,int,res,跳跃,dp
From: https://www.cnblogs.com/929code/p/17389646.html