跳跃游戏--DP和贪心策略
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跳跃游戏--DP和贪心策略相关的知识,希望对你有一定的参考价值。
题目:
dp解法
- dp定义:dp[i]表示在该下标处最多往前跳多少次
- 选择:<1>.跳到该i处后得到新的跳跃次数。<2>.如果新得到的跳跃次数还不如之前的跳跃次数-1那么不更新.
- dp关系:dp[i] = max(dp[i-1]-1,nums[i]),而且更新的前提是dp[i-1]-1大于等于0,要不然到不了dp[i]处.
- base case:dp[0] = nums[0].
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==1)
return true;
int dp[nums.size()];
memset(dp,0,sizeof(dp));
dp[0] = nums[0];
for (int i = 0; i < nums.size(); i++){
if(i>0&&dp[i-1]>0){
dp[i] = max(dp[i-1]-1,nums[i]);
}
//如果当前位置+当前最大往前距离>=最后的下标,则可以返回true,并且不能是最后一个下标的情况
if(i!=nums.size()-1&&dp[i]+i>=nums.size()-1)
return true;
}
return false;
}
};
贪心策略
不断更新最大能到达的下标处,如果大于等于了最后的下标值,则返回true。
class Solution {
public:
//贪心策略:选择跳与不跳到该格子的理由是,一旦跳到该格子后,可以跳的距离变得更加远,则更新最远跳跃距离,否则不更
//举例子:示例一中,我们开始只能往前跳两步到达下标为2的位置,而如果第一次跳一步,到达3,则可以最多跳到1+3的下标位置,故此时更新,再判断到nums[2]的位置后能跳的范围是不是更大,显然不会,所以最大范围maxFar不更新,如果跳到nums[3]与当前位置的跳跃范围相等,故不更新,实际上到了nums[1]的时候就已经得到了答案,因为i(跳到此处用了多少步)+nums[i]表示最多到达下标1+3 = 4为nums最后一个下标,故已经得到答案。
bool canJump(vector<int>& nums) {
if(nums.size()==1)
return true;
int maxFar = nums[0];
for(int i=1;i<nums.size();i++){
//判断是否可以跳到该下标位置i,如果可以看是否需要更新maxFar
if(maxFar>=i){
maxFar = max(maxFar,i+nums[i]);
}
//如果更新到的范围已经超过或者等于最后一个下标,则返回true
if(maxFar>=nums.size()-1)
return true;
}
return false;
}
};
以上是关于跳跃游戏--DP和贪心策略的主要内容,如果未能解决你的问题,请参考以下文章