//「现在所处的石子编号」为 i 时,「上一次跳跃距离」k 必定满足 k≤i // 由上可知 当第 i 个石子与第 i−1 个石子距离超过 i 时,青蛙必定无法到达终点 classSolution { public: boolcanCross(vector<int>& stones){ int n = stones.size(); // dp[i][k] 表示青蛙能否达到「现在所处的石子编号」为 i 且「上一次跳跃距离」为 k 的状态 vector<vector<int>> dp(n, vector<int>(n)); dp[0][0] = true; for (int i = 1; i < n; i ++) if (stones[i] - stones[i - 1] > i) returnfalse; for (int i = 1; i < n; i ++) { for (int j = i - 1; j >= 0; j --) { // 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]) returntrue; } } returnfalse; } };