题意理解
已知一个数组,每个元素表示可以跳的最大长度,问从第一个元素开始,是否能跳转到最后一个元素
问题分析
用动规
状态量是当前位置可跳转的最大长度。
状态转移方程:当前元素的最大长度,等于前一个元素的最大长度减1,和当前元素最大长度两者之间的最大值
如果当前元素最大长度为0,那么无法再向后跳转。如果当前元素不是最后一个元素,返回false,否则,返回true。
其他
状态量不用true,false,信息量不够
链接
bool canJump(vector<int>& nums) {
int len = nums.size();
if (len == 1) //列表只有一个元素,直接可以跳
return true;
int maxJump = 0; //当前可以跳的最大长度
for(int i = 0; i != len - 1; i ++) //从第一个开始,直到倒数第二个元素,(直到倒数第二个不为0就可以调转到最后一个)
{
maxJump = max(maxJump - 1, nums[i]); //当前最大长度是前一个元素最大长度减1,当前可以跳的长度两者最大值
cout << maxJump << endl;
if (maxJump == 0) //如果最大值是0
{
return false; //无法向前跳转,返回false
}
}
return true; //遍历完成,表示跳转成功
}