classSolution{public:vector<int>cheapestJump(vector<int>&coins,intmaxJump){if(coins.back()==-1)return{};constintn=coins.size();vector<int>next(n,-1);// dp[i] := min cost to jump from i to n - 1dp.resize(n,INT_MAX);cheapestJump(coins,maxJump,0,next);if(dp[0]==INT_MAX)return{};returnconstructPath(next,0);}private:vector<int>dp;intcheapestJump(constvector<int>&coins,intmaxJump,inti,vector<int>&next){if(i==coins.size()-1)returndp[i]=coins[i];if(dp[i]<INT_MAX)returndp[i];if(coins[i]==-1)returnINT_MAX;for(intj=i+1;j<=i+maxJump&&j<coins.size();++j){constintres=cheapestJump(coins,maxJump,j,next);if(res==INT_MAX)continue;constintcost=coins[i]+res;if(cost<dp[i]){dp[i]=cost;next[i]=j;}}returndp[i];}vector<int>constructPath(constvector<int>&next,inti){vector<int>ans;while(i!=-1){ans.push_back(i+1);// 1-indexedi=next[i];}returnans;}};
classSolution{publicList<Integer>cheapestJump(int[]coins,intmaxJump){if(coins[coins.length-1]==-1)returnnewArrayList<>();finalintn=coins.length;int[]next=newint[n];Arrays.fill(next,-1);// dp[i] := min cost to jump from i to n - 1dp=newint[n];Arrays.fill(dp,Integer.MAX_VALUE);cheapestJump(coins,maxJump,0,next);if(dp[0]==Integer.MAX_VALUE)returnnewArrayList<>();returnconstructPath(next,0);}privateint[]dp;privateintcheapestJump(int[]coins,intmaxJump,inti,int[]next){if(i==coins.length-1)returndp[i]=coins[i];if(dp[i]<Integer.MAX_VALUE)returndp[i];if(coins[i]==-1)returnInteger.MAX_VALUE;for(intj=i+1;j<Math.min(i+maxJump+1,coins.length);++j){finalintres=cheapestJump(coins,maxJump,j,next);if(res==Integer.MAX_VALUE)continue;finalintcost=coins[i]+res;if(cost<dp[i]){dp[i]=cost;next[i]=j;}}returndp[i];}privateList<Integer>constructPath(int[]next,inti){List<Integer>ans=newArrayList<>();while(i!=-1){ans.add(i+1);// 1-indexedi=next[i];}returnans;}}
classSolution:defcheapestJump(self,coins:List[int],maxJump:int)->List[int]:ifcoins[-1]==-1:return[]n=len(coins)# dp[i] := min cost to jump from i to n - 1dp=[math.inf]*nnext=[-1]*ndefcheapestJump(i:int)->int:ifi==len(coins)-1:dp[i]=coins[i]returndp[i]ifdp[i]<math.inf:returndp[i]ifcoins[i]==-1:returnmath.infforjinrange(i+1,min(i+maxJump+1,n)):res=cheapestJump(j)ifres==math.inf:continuecost=coins[i]+resifcost<dp[i]:dp[i]=costnext[i]=jreturndp[i]cheapestJump(0)ifdp[0]==math.inf:return[]returnself._constructPath(next,0)def_constructPath(self,next:List[int],i:int)->List[int]:ans=[]whilei!=-1:ans.append(i+1)# 1-indexedi=next[i]returnans