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 , 必然无法到达终点。
浙公网安备 33010602011771号