DP(3):可行性(存在)型

题目:

有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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值