跳跃游戏V

给你一个整数数组 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;

	}
};

posted @ 2023-05-10 23:02  失控D大白兔  阅读(15)  评论(0)    收藏  举报