Coin Path

hard dp greedy

Problem

Hop forward up to maxJumps steps. coins[i] = -1 is blocked. Return lexicographically smallest path of indices (1-indexed) from 0 to n−1 with minimum coin sum.

Inputcoins=[1,2,4,-1,2] maxJumps=2
Output[1,3,5]
Path 1→3→5 costs 1+4+2=7.

def cheapest_jump(c, k):
    n = len(c)
    if c[-1] == -1: return []
    dp = [10**18] * n; nxt = [-1] * n; dp[-1] = c[-1]
    for i in range(n - 2, -1, -1):
        if c[i] == -1: continue
        for j in range(1, k + 1):
            if i + j < n and dp[i+j] < 10**18 and c[i] + dp[i+j] < dp[i]:
                dp[i] = c[i] + dp[i+j]; nxt[i] = i + j
    if dp[0] == 10**18: return []
    out, i = [], 0
    while i != -1: out.append(i + 1); i = nxt[i]
    return out
function cheapestJump(c, k) {
  const n = c.length; if (c[n - 1] === -1) return [];
  const dp = new Array(n).fill(Infinity); const nxt = new Array(n).fill(-1); dp[n - 1] = c[n - 1];
  for (let i = n - 2; i >= 0; i--) {
    if (c[i] === -1) continue;
    for (let j = 1; j <= k; j++)
      if (i + j < n && dp[i + j] < Infinity && c[i] + dp[i + j] < dp[i]) { dp[i] = c[i] + dp[i + j]; nxt[i] = i + j; }
  }
  if (!isFinite(dp[0])) return [];
  const out = []; let i = 0;
  while (i !== -1) { out.push(i + 1); i = nxt[i]; }
  return out;
}
List cheapestJump(int[] c, int k) {
    int n = c.length; if (c[n - 1] == -1) return new ArrayList<>();
    long[] dp = new long[n]; int[] nxt = new int[n]; Arrays.fill(dp, Long.MAX_VALUE); Arrays.fill(nxt, -1);
    dp[n - 1] = c[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        if (c[i] == -1) continue;
        for (int j = 1; j <= k; j++)
            if (i + j < n && dp[i + j] != Long.MAX_VALUE && c[i] + dp[i + j] < dp[i]) { dp[i] = c[i] + dp[i + j]; nxt[i] = i + j; }
    }
    List out = new ArrayList<>();
    if (dp[0] == Long.MAX_VALUE) return out;
    int i = 0; while (i != -1) { out.add(i + 1); i = nxt[i]; }
    return out;
}
vector cheapestJump(vector& c, int k) {
    int n = c.size(); if (c[n - 1] == -1) return {};
    vector dp(n, LLONG_MAX); vector nxt(n, -1); dp[n - 1] = c[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        if (c[i] == -1) continue;
        for (int j = 1; j <= k; j++)
            if (i + j < n && dp[i + j] != LLONG_MAX && c[i] + dp[i + j] < dp[i]) { dp[i] = c[i] + dp[i + j]; nxt[i] = i + j; }
    }
    if (dp[0] == LLONG_MAX) return {};
    vector out; int i = 0;
    while (i != -1) { out.push_back(i + 1); i = nxt[i]; }
    return out;
}
Time: O(n·k) Space: O(n)