【记忆化搜索】1340. 跳跃游戏 V

需要记录两类值即可,一个是每个节点向左最多能到的节点数,一个是每个节点向右最多能到的节点数,并通过dfs来搜索即可。

class Solution {
public:
    vector<int> *record_left;
    vector<int> *record_right;
    const int LEFT = 0;
    const int RIGHT = 1;

    int dfs(vector<int>& arr, int d, int loc, int dir){
        int res = 1;
        if(dir == LEFT){
            for(int i=loc-1;i>=0&&i>=loc-d&&arr[loc]>arr[i];--i){
                if((*record_left)[i] == -1){
                    (*record_left)[i] = dfs(arr, d, i, LEFT);
                }
                if((*record_right)[i] == -1){
                    (*record_right)[i] = dfs(arr, d, i, RIGHT);
                }
                res = max(res, max((*record_left)[i], (*record_right)[i]) + 1);
            }
        } else {
            for(int i=loc+1;i<arr.size()&&i<=loc+d&&arr[loc]>arr[i];++i){
                if((*record_left)[i] == -1){
                    (*record_left)[i] = dfs(arr, d, i, LEFT);
                }
                if((*record_right)[i] == -1){
                    (*record_right)[i] = dfs(arr, d, i, RIGHT);
                }
                res = max(res, max((*record_left)[i], (*record_right)[i]) + 1);
            }
        }
        return res;
    }

    int maxJumps(vector<int>& arr, int d) {
        int len = arr.size();
        record_left = new vector<int>(len, -1);
        record_right = new vector<int>(len, -1);
        int result = 0;
        (*record_left)[0] = 1;
        (*record_right)[len-1]=1;
        for(int i=0;i<len;++i){
            if((*record_left)[i] == -1){
               (*record_left)[i] = dfs(arr, d, i, LEFT);
            }
            if((*record_right)[i] == -1){
               (*record_right)[i] = dfs(arr, d, i, RIGHT);
            }
            result = max(result, max((*record_left)[i], (*record_right)[i]));
            // cout << i << ":" << (*record_left)[i] << "," << (*record_right)[i] << endl;
        }

        delete record_left;
        delete record_right;
        return result;
    }
};
posted @ 2022-02-28 19:56  fwx  阅读(23)  评论(0)    收藏  举报