3
bool canCross(vector<int> &stones) {4
unordered_map<int, bool> mp; // to see the position where stone is present5
for (int i = 0; i < stones.size(); i++) {8
int stone = 1; // current stone9
int jump = 1; // jump made10
int last_stone = stones[stones.size() - 1]; // last stone on which frog will land to cross river11
map<pair<int, int>, bool> dp;12
return fun(mp, stone, jump, dp, last_stone);14
bool fun(unordered_map<int, bool> &mp, int stone, int jump, map<pair<int, int>, bool> &dp,16
if (stone == ls) // reached last stone20
if (mp.find(stone) == mp.end()) // stone is not present24
if (dp.find({stone, jump}) != dp.end()) {25
return dp[{stone, jump}];30
if ((stone + jump - 1) > stone) // can take jump of k-1 units32
jump1 = fun(mp, stone + jump - 1, jump - 1, dp, ls);34
if ((stone + jump) > stone) // can take jump of k units36
jump2 = fun(mp, stone + jump, jump, dp, ls);38
if ((stone + jump + 1) > stone) // can take jump of k+1 units40
jump3 = fun(mp, stone + jump + 1, jump + 1, dp, ls);42
dp[{stone, jump}] = jump1 or jump2 or jump3;43
return dp[{stone, jump}];