classSolution{public:boolcanCross(vector<int>&stones){constintn=stones.size();// dp[i][j] := true if a frog can make a size j jump to stones[i]vector<vector<bool>>dp(n,vector<bool>(n+1));dp[0][0]=true;for(inti=1;i<n;++i)for(intj=0;j<i;++j){constintk=stones[i]-stones[j];if(k>n)continue;for(constintx:{k-1,k,k+1})if(0<=x&&x<=n)dp[i][k]=dp[i][k]||dp[j][x];}returnany_of(begin(dp.back()),end(dp.back()),[](boolval){returnval;});}};
classSolution{publicbooleancanCross(int[]stones){finalintn=stones.length;// dp[i][j] := 1 if a frog can make a size j jump to stones[i]int[][]dp=newint[n][n+1];dp[0][0]=1;for(inti=1;i<n;++i)for(intj=0;j<i;++j){finalintk=stones[i]-stones[j];if(k>n)continue;for(finalintx:newint[]{k-1,k,k+1})if(0<=x&&x<=n)dp[i][k]|=dp[j][x];}returnArrays.stream(dp[n-1]).anyMatch(a->a==1);}}
classSolution:defcanCross(self,stones:List[int])->bool:n=len(stones)# dp[i][j] := True if a frog can make a size j jump to stones[i]dp=[[False]*(n+1)for_inrange(n)]dp[0][0]=Trueforiinrange(1,n):forjinrange(i):k=stones[i]-stones[j]ifk>n:continueforxin(k-1,k,k+1):if0<=x<=n:dp[i][k]|=dp[j][x]returnany(dp[-1])