b_lc_跳跃游戏 vii(前缀和 + dp)

一开始,你在下标 0 处,且该位置的值一定为 '0' 。当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:

  • i + minJump <= j <= min(i + maxJump, s.length - 1) 且
  • s[j] == '0'.

如果你可以到达 s 的下标 s.length - 1 处,请你返回 true ,否则返回 false 。

思路:一般都是向后 x 个单位看某个点 j,如果 j 能到达,则当前位置 i 可达.
f[i] 表示i是否可达,pre[i]表示f的前缀和,只要区间 [i-maxjump, i-minjump] 中有一个位置可达,则 i 可达

class Solution:
    def canReach(self, s: str, a: int, b: int) -> bool:
        n = len(s)
        pre = [0] * (n + 1)
        f = [False] * (n + 1)
        pre[1] = f[1] = 1

        for i in range(1, n + 1):
            if s[i-1] == '0':
                l = max(0, i - b)
                r = max(0, i - a)
                if r >= 1 and pre[r] - pre[l - 1] > 0:
                    f[i] = True
            pre[i] = pre[i-1] + f[i]
        return f[n]
posted @ 2021-06-05 20:32  童年の波鞋  阅读(46)  评论(0编辑  收藏  举报