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;
}
}