【Leetcode每日一题】2021-04-29 403 青蛙过河 - 困难 - 动态规划 (Python & C++)

来源:力扣

为了选出新的首领,青蛙部落准备在河边举办一场比赛,部落的首领必须同时具备强健的体魄灵活的头脑,所以举办方制定了如下的比赛规则:

  • 假定河流被等分为若干个单元格,在其中的一些单元格内放有一块石子。
  • 石子的位置存在stones中(用石子所在单元格的序号升序表示)。
  • 候选人只能从一块石子跳到另一块石子,跳入水中即视为淘汰。
  • 开始时,候选人站在第一块石子上,规定第一步只能跳一个单元格的距离,即只能从单元格1跳到单元格2,即stones[0]0stones[1]必须为1
  • 为了选出最优秀的候选人,规定如果候选人上一步跳跃了k个单位,那么它接下来的跳跃距离只能为k-1kk+1个单位,而且只准向前跳(终点的方向)。
  • 胜利的条件就是跳到最后一块石子上(跳不到或者跳过头都视为淘汰)。


举办方为了比赛的公平和多样性,设计了很多不同的赛道stones,每个候选人都会从这些赛道中抽取自己的赛道,所以必须保证每条赛道都是有解的(即肯定有一种满足比赛规则的跳法能胜利),所以举办方请你来帮助验证赛道的有效性。

示例 1:
输入:stones = [0,1,3,5,6,8,12,17]
输出:true
解释:该赛道是有效的,按照如下方案跳跃:跳 1 个单位到第 2 块石子, 然后跳 2 个单位到第 3 块石子, 接着跳 2 个单位到第 4 块石子, 然后跳 3 个单位到第 6 块石子, 跳 4 个单位到第 7 块石子, 最后,跳 5 个单位到第 8 个石子(即最后一块石子)。

示例 2:
输入:stones = [0,1,2,3,4,8,9,11]
输出:false
解释:这是因为第 5 和第 6 个石子之间的间距太大,没有可选的方案供青蛙跳跃过去。

提示:
2 <= stones.length <= 2000
0 <= stones[i] <= 231 - 1
stones[0] == 0

标签:回溯,记忆化搜索,动态规划


1.记忆化搜索(DFS)

数据结构:set,map/dict
知识点
  Python:
   - 用functools里的@lru_cache(None)及其语法糖@cache来实现记忆化搜索
   - setdict的查找复杂度(a in set(b))都为 O ( 1 ) \mathcal{O}(1) O(1),而list查找复杂度为 O ( n )

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值