LeetCode 403. 青蛙过河

一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。

给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃 1 个单位(即只能从单元格 1 跳至单元格 2 )。

如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位。 另请注意,青蛙只能向前方(终点的方向)跳跃。

暴力、暴力

const int N = 2010;
class Solution {
public:
    bool f[N][N];
    bool dfs(vector<int>& stones, int u, int k)
    {
        if(f[u][k]) return false; //已经搜索过了,不用搜索了

        if(u == stones.size() - 1)  return true;

        f[u][k] = true;
        int a = stones[u] + k  + 1;
        for(int j = u + 1; stones[j] <= a && j < stones.size(); j ++)
        {
            int b = stones[j] - stones[u];
            if(b >= k - 1 && b <= k + 1)
                if(dfs(stones, j, b)) 
                    return true;
        }
        return false;
    }
    bool canCross(vector<int>& stones) {

        return dfs(stones, 0, 0);

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值