思路:

动态规划。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 };

相关文章: