403. Frog Jump

 

 

 

 

 

 

 

class Solution {
public:
    bool canCross(vector<int>& stones) {
        int n = stones.size();
        vector<vector<int> > dp(n, vector<int>(n));
        dp[0][0] = true;
        for(int i = 0; i < n - 1; i++) 
            if(stones[i+1] - stones[i] > i + 1)
                return false;
        for(int i = 1; i < n; i++) {
            for(int j = i - 1; j >= 0; j--) {
                int k = stones[i] - stones[j];
                if(k > j + 1) break;
                dp[i][k] = dp[j][k-1] || dp[j][k] || dp[j][k+1];
                if(i == n - 1 && dp[i][k]) return true;
            }
        }
        return false;
    }
};

思路:动态规划

由于能否跳到后面某一石头 j 只与当前石头编号 i 和上一次跳跃的距离 k 有关。

dp[i][k]表示上一次跳跃距离为 k 的情况下再跳一次能否到达编号为 i 的石头。

优化:

如果已经在编号为 j 的石头上,则上一次跳跃距离 k 必然小于等于 j

第 i 与 第 i-1 石子距离超过 i , 必然无法到达终点。

posted on 2021-04-29 10:43  hannah_id  阅读(26)  评论(0)    收藏  举报

导航