思路:
动态规划。dp[i][j]表示目前在第i块石头上,并且上一次是从第j块石头跳过来的。
实现:
1 class Solution 2 { 3 public: 4 bool canCross(vector<int>& stones) 5 { 6 int n = stones.size(); 7 for (int i = 1; i < n; i++) 8 { 9 if (stones[i] - stones[i - 1] > i) return false; 10 } 11 vector<vector<bool>> dp(n, vector<bool>(n, false)); 12 dp[0][0] = true; 13 for (int i = 0; i < n; i++) 14 { 15 for (int j = i - 1; j >= 0; j--) 16 { 17 int d = stones[i] - stones[j]; 18 if (d > j + 1) break; 19 if (dp[j][d - 1] or dp[j][d] or dp[j][d + 1]) dp[i][d] = true; 20 } 21 } 22 for (int i = 0; i < n; i++) 23 { 24 if (dp[n - 1][i]) return true; 25 } 26 return false; 27 } 28 };