参考题解:官方题解
问题:
标签:
- 动态规划。
思路:
- 这是一道典型的动态规划题。
- 用二维布尔数组存储状态。
DP[0][0]
为初始状态为 true。 - 状态转移
DP[I][K] = DP[J][K - 1] || DP[J][K] || DP[J][K + 1]
。 - 当两个石头间距大于 i 时没有答案。
题解:
class Solution {
public boolean canCross(int[] stones) {
int n = stones.length;
boolean[][] dp = new boolean[n][n];
dp[0][0] = true;
for (int i = 1; i < n; ++i) {
if (stones[i] - stones[i - 1] > i) {
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;
}
}