【记忆化搜索】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;
}
};

浙公网安备 33010602011771号