Leetcode 5331.跳跃游戏
题目描述:
题解:令dp[i]为从位置i开始所能访问的最大下标数。转移方程为dp[i] = max(dp[i],dp[j]+1),j为位置i可达点的下标。自底向上更新的dp,优先把位置低的点d更新出来即可。
(一开始一直没有找到合适的有序遍历方法,其实排序一下就好了 )
AC代码:
int maxJumps(vector<int>& arr, int d) { int n = arr.size(); vector<vector<int>> temp; vector<int> dp(n, 0); 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; //向左找 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; }