dp[i][k]代表第i块,上次跳了k距离的状态,
第i块最多跳i步,预处理非法状态,
中间状态 第j块最多跳j步,剪枝非法状态。
class Solution {
public boolean canCross(int[] stones) {
int len = stones.length;
//dp[i][k]代表第i块,上次跳了k距离的状态
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len - 1; i++) {
if (stones[i + 1] - stones[i] > i + 1) {
return false;
}
}
dp[0][0] = true;
for (int i = 1; i < len; 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 == len - 1 && dp[i][k]) {
return true;
}
}
}
return false;
}
}

该博客探讨了一种使用动态规划解决跳跃游戏问题的方法。代码实现中,dp[i][k]表示到达第i个石头时,上一次跳跃了k距离的状态。预处理非法状态,并在中间状态剪枝,以优化效率。最后,检查是否能成功到达最后一个石头。
473

被折叠的 条评论
为什么被折叠?



