题目:
有n块石头分别在x轴的0,1,2…n-1位置.一只青蛙在石头0,想跳到石头n-1,如果青蛙在第i块石头上它最多可以向右跳距离ai,问青蛙是否能调到石头n-1上.
eg:
输入:a=[2,3,1,1,4]
输出:true
解析:
一.确定状态
①最后一步
- 如果青蛙能跳到最后一块石头n-1,我们考虑它跳的最后一步
- 这一步是从石头i跳过来的i<n-1
- 需要满足两个条件:①青蛙可以调到石头i②最后一步不超过跳跃的最大距离
②子问题
- 我们需要知道青蛙能不能跳到石头i(i<n-1)
- 而我们原来要求的是青蛙能不能跳到石头n-1
- 子问题.
- 状态是:设f[j]表示青蛙能不能跳到石头j
二.转移方程
设f[j]表示青蛙能不能跳到石头j
f[j] = OR(f[i] AND i+a[i] >=j)
青蛙能不能跳到石头j =
枚举上一个跳到的石头i (青蛙能不能跳到石头i && i向右的最大距离大于等于i和石头j之间的距离)
只要有一个i满足即为true,否则为false.
三.初始条件和边界情况
①初始条件: f[0] = true
②边界条件: 无
四.计算顺序
从小到大
solution:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n,k;//n块石头
cin>>n;
vector<int> vec(n);
vector<bool> f(n);//是否可以跳到石头上
for(int i=0;i<n;i++)
{
cin>>k;
vec[i] = k;//每一块石头向右跳的最大值
}
f[0] = true;
for(int j =1;j<n;j++)
{
for(int i=0;i<j;i++)//从前面的石头开始遍历
{
if(f[i] && i+vec[i]>=j)//能跳到第i块石头上并且当前位置加上第i块石头上能跳的最大距离>=目标石头的位置
{
f[j]=true;
break;
}
}
}
cout<<f[n-1]<<endl;
return 0;
}