Minimum Cost to Cut a Stick

hard array dp sorting

Problem

A wooden stick of length n; cuts[] are the required cut positions. Cost of a cut equals the length of the piece you cut. Return the minimum total cost (cuts may be performed in any order).

Inputn=7, cuts=[1,3,4,5]
Output16
Sentinels [0,1,3,4,5,7]; optimal order minimizes piece-length sum.

def min_cost(n, cuts):
    c = sorted([0] + cuts + [n])
    m = len(c)
    dp = [[0]*m for _ in range(m)]
    for length in range(2, m):
        for i in range(m - length):
            j = i + length
            dp[i][j] = min(dp[i][k] + dp[k][j] for k in range(i + 1, j)) + c[j] - c[i]
    return dp[0][m-1]
function minCost(n, cuts) {
  const c = [0, ...cuts, n].sort((a, b) => a - b);
  const m = c.length;
  const dp = Array.from({length: m}, () => new Array(m).fill(0));
  for (let len = 2; len < m; len++) {
    for (let i = 0; i < m - len; i++) {
      const j = i + len; let best = Infinity;
      for (let k = i + 1; k < j; k++) best = Math.min(best, dp[i][k] + dp[k][j]);
      dp[i][j] = best + c[j] - c[i];
    }
  }
  return dp[0][m-1];
}
class Solution {
    public int minCost(int n, int[] cuts) {
        int[] c = new int[cuts.length + 2];
        c[0] = 0; c[c.length - 1] = n;
        for (int i = 0; i < cuts.length; i++) c[i + 1] = cuts[i];
        Arrays.sort(c);
        int m = c.length;
        int[][] dp = new int[m][m];
        for (int len = 2; len < m; len++) for (int i = 0; i < m - len; i++) {
            int j = i + len, best = Integer.MAX_VALUE;
            for (int k = i + 1; k < j; k++) best = Math.min(best, dp[i][k] + dp[k][j]);
            dp[i][j] = best + c[j] - c[i];
        }
        return dp[0][m-1];
    }
}
int minCost(int n, vector& cuts) {
    vector c = cuts; c.push_back(0); c.push_back(n);
    sort(c.begin(), c.end());
    int m = c.size();
    vector> dp(m, vector(m, 0));
    for (int len = 2; len < m; len++) for (int i = 0; i < m - len; i++) {
        int j = i + len, best = INT_MAX;
        for (int k = i + 1; k < j; k++) best = min(best, dp[i][k] + dp[k][j]);
        dp[i][j] = best + c[j] - c[i];
    }
    return dp[0][m-1];
}
Time: O(M^3) Space: O(M^2)