1 #define pb push_back
2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
3 class Solution
4 {
5 public:
6 bool canCross(vector<int>& stones)
7 {
8 int sz = stones.size();
9 if(sz==2&&stones[1]==1) return true;
10
11 vector<set<int>> dp(sz);
12 dp[0].insert(0);
13 for(int i = 1; i < sz; i ++)
14 {
15 int szz = dp[i-1].size();
16 cout << szz << endl;
17 for(auto j = dp[i-1].begin(); j != dp[i-1].end(); j ++)
18 {
19 if(binary_search(stones.begin(),stones.end(),stones[i-1]+*j))
20 dp[lower_bound(stones.begin(),stones.end(),stones[i-1]+*j)-stones.begin()].insert(*j);
21 if(binary_search(stones.begin(),stones.end(),stones[i-1]+*j+1))
22 dp[lower_bound(stones.begin(),stones.end(),stones[i-1]+*j+1)-stones.begin()].insert(*j+1);
23 if(*j!=1&&binary_search(stones.begin(),stones.end(),stones[i-1]+*j-1))
24 dp[lower_bound(stones.begin(),stones.end(),stones[i-1]+*j-1)-stones.begin()].insert(*j-1);
25 }
26 }
27 if(dp[sz-1].empty())
28 return false;
29 return true;
30 }
31 };