跳跃游戏(一)
描述
给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。如果能够跳到数组最后一个位置,则输出true,否则输出false。
数据范围:
1<=nums.length<=2×105
0<=nums[i]<=105
输入描述:
第一行输入一个正整数 n ,表示数组 nums 的长度
第二行输入 n 个整数表示数组的每个元素
输出描述:
输出 true 或者 false


思路一(会超时)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5+10;
int a[N];
bool dp[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dp[1]=true;
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(dp[i-j]&&a[i-j]>=j)
{
// cout<<"i="<<i<<endl;
dp[i]=true;
break;
}
}
}
if(dp[n]) cout<<"true"<<endl;
else cout<<"false"<<endl;
}
思路二:
从i=1开始依次遍历每一层所能到达的最高层,标识符high表示目前能到达的最高层,如果high小于i则表示到达不了第i层 返回false
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5+10;
int a[N];
bool dp[N];
int main()
{
int high = 1;
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
if(high>=n)
{
cout<<"true"<<endl;
break;
}
if(i<=high)
{
high=max(high,i+a[i]);
// cout<<"high="<<high<<endl;
}
else
{
cout<<"false"<<endl;
break;
}
}
}

浙公网安备 33010602011771号