Minimum Cost to Cut a Stick

HardArrayDynamic ProgrammingSorting

Solution

import { range } from '@algorithm/lib';
 
export function minCost(n: number, cuts: number[]): number {
  const points = [...cuts, 0, n].sort((a, b) => a - b);
  const p = points.length;
  const dp = Array.from({ length: p }).map(() => new Array<number>(p).fill(0));
 
  for (const diff of range(2, p)) {
    for (const start of range(p - diff)) {
      const end = start + diff;
      let minCost = Number.MAX_SAFE_INTEGER;
      for (const mid of range(start + 1, end)) {
        minCost = Math.min(minCost, dp[start][mid] + dp[mid][end] + points[end] - points[start]);
      }
      dp[start][end] = minCost;
    }
  }
 
  return dp[0][p - 1];
}