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;

    }
原文地址:https://www.cnblogs.com/z1141000271/p/12252414.html