每日一题LeetCode 403 青蛙过河 dp 哈希

https://leetcode-cn.com/problems/frog-jump/

思路

f [ i ] [ j ] f[i][j] f[i][j]在第 i i i个格子处能否跳距离 j j j,以0/1表示,那么

f [ i ] [ j ] = f [ k ] [ j − 1 ] ∣ ∣ f [ k ] [ j ] ∣ ∣ f [ k ] [ j + 1 ] , k 为上个点的位置 f[i][j] = f[k][j-1] \quad || \quad f[k][j]\quad|| \quad f[k][j+1] ,\qquad k \text{为上个点的位置} f[i][j]=f[k][j1]f[k][j]f[k][j+1],k为上个点的位置

k可以取为

k = { i − ( j − 1 ) 对应石子 i − j 对应石子 i − ( j + 1 ) 对应石子 k=\begin{cases} i-(j-1) \text{对应石子}\\ i-j\text{对应石子}\\ i-(j+1)\text{对应石子} \end{cases} k=i(j1)对应石子ij对应石子i(j+1)对应石子

要快速的根据石头坐标找到位置,可以用一个哈希表映射。

const int maxn = 2005;
class Solution {
    public:
    int f[maxn][maxn];
    vector<int> p;
    unordered_map <int,int> hash;
    int dp(int i,int j)
    {
        if(f[i][j] != -1)
            return f[i][j];
        f[i][j] = 0;
        for(int k = max(1,j - 1);k <= j + 1;k++){
            int x = p[i] - k;
            if(hash.count(x)){
                x = hash[x];
                if(dp(x,k)){
                    f[i][j] = 1;
                    break;
                }
            }
        }
        return f[i][j];
    }
    bool canCross(vector<int>& stones) {
        p = stones;
        for(int i =0;i < stones.size();i++)
            hash[stones[i]] = i;
        memset(f,-1,sizeof(f));
        f[0][1] = 1;
        for(int i = 0;i <= stones.size() ; i++){
            if(dp(stones.size() - 1,i))
                return true;
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值