把每一个位置看作图上的一个点,是一个有向无环图,因为必须向比当前位置的高度低的地方跳,不能反过来跳。就是求一条最长路径。对于每一个点来说,由于是有向无环图,它的最长路径是确定的,所以我们可以记录每一个点的最长路径,加快dfs,复杂度O(n)。
class Solution {
public:
int left_max[1005];
int right_max[1005];
int n;
int d;
int record[1005];
int dfs(int u){
if(record[u]!=-1)
return record[u];
int ans=0;
for(int i=1;i<=min(d,right_max[u]) && u+i<n;i++){
ans=max(ans,dfs(u+i));
}
for(int i=1;i<=min(d,left_max[u]) && u-i>=0;i++){
ans=max(ans,dfs(u-i));
}
record[u]=ans+1;
return ans+1;
}
int maxJumps(vector<int>& arr, int d_) {
n=arr.size();
d=d_;
memset(record,-1,sizeof(record));
for(int i=0;i<n;i++){
for(int j=1;i-j>=0;j++){
if(arr[i]>arr[i-j]){
left_max[i]=j;
}
else
break;
}
for(int j=1;i+j<n;j++){
if(arr[i]>arr[i+j]){
right_max[i]=j;
}
else
break;
}
}
int ans=0;
for(int i=0;i<n;i++)
ans=max(ans,dfs(i));
return ans;
}
};