https://leetcode-cn.com/problems/frog-jump/submissions/
这道题就是循环,完全配不上困难这个级别啊
int[][] dp;
public boolean canCross(int[] stones) {
if (stones[1] != 1) {
return false;
}
dp = new int[stones.length + 1][stones.length];
return getCan(stones, 1, 1, stones.length - 1);
}
/**
* @param stones
* @param step 这一步走了几格
* @param sta 这一步是第几格(数组值)
* @param end 目标是第几格
* @return
*/
private boolean getCan(int[] stones, int step, int sta, int end) {
if (sta == end) {
//咦,我所在的位置是终点,我成功了
return true;
}
if (dp[step][sta] == 1) {
//前人告诉我,这条路不通
return false;
}
for (int i = sta + 1; i <= end; i++) {
if (stones[i] - stones[sta] < step - 1) {
//距离过短,不跳
continue;
}
if (stones[i] - stones[sta] > step + 1) {
//距离过长,不跳,而且跳出循环
break;
}
if (getCan(stones, stones[i] - stones[sta], i, end)) {
return true;
}
}
//这么跳是不会成功的,给后人以警告
dp[step][sta] = 1;
return false;
}
如果有leetcode不明白的题目,欢迎评论,一起探讨