#include #include #include class LC230827 { public: static bool canCross(const std::vector&); }; bool LC230827::canCross(const std::vector& stones) { if (stones[1] != 1) return false; const int n = stones.size(); std::unordered_map can_jump; std::unordered_map rev; for (int i = 0; i < n; ++i) rev[stones[i]] = i; auto key_of = [&](int position, int k) { return ((unsigned long long)(k) << 32) | position; }; std::function dp = [&](int position, int k) { if (position == n - 1) return 1; const auto key = key_of(position, k); if (can_jump.count(key)) return can_jump[key]; int ret = 0; for (int i = -1; i <= 1; ++i) { if (k + i <= 0 || !rev.count(stones[position] + k + i)) continue; ret |= dp(rev[stones[position] + k + i], k + i); } return can_jump[key] = ret; }; return dp(1, 1); }