int minCost(int n, vector<int>& cuts) {
vector<int> pts{0}; pts.insert(pts.end(), cuts.begin(), cuts.end()); sort(pts.begin() + 1, pts.end()); pts.push_back(n);
function<int(int, int)> solve = [&](int i, int j) -> int {
if (j - i < 2) return 0;
int best = INT_MAX;
for (int k = i + 1; k < j; k++) {
best = min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i]);
}
return best;
};
return solve(0, (int)pts.size() - 1);
}
public int minCost(int n, int[] cuts) {
int[] pts = new int[cuts.length + 2];
int[] sorted = cuts.clone(); Arrays.sort(sorted);
for (int i = 0; i < sorted.length; i++) pts[i + 1] = sorted[i];
pts[pts.length - 1] = n;
return solve(pts, 0, pts.length - 1);
}
private int solve(int[] pts, int i, int j) {
if (j - i < 2) return 0;
int best = Integer.MAX_VALUE;
for (int k = i + 1; k < j; k++) {
best = Math.min(best, solve(pts, i, k) + solve(pts, k, j) + pts[j] - pts[i]);
}
return best;
}
def min_cost(n, cuts):
pts = [0] + sorted(cuts) + [n]
def solve(i, j):
if j - i < 2: return 0
best = float('inf')
for k in range(i + 1, j):
best = min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i])
return best
return solve(0, len(pts) - 1)
function minCost(n: number, cuts: number[]): number {
const pts = [0, ...[...cuts].sort((a, b) => a - b), n];
const solve = (i: number, j: number): number => {
if (j - i < 2) return 0;
let best = Infinity;
for (let k = i + 1; k < j; k++) {
best = Math.min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i]);
}
return best;
};
return solve(0, pts.length - 1);
}
int minCost(int n, vector<int>& cuts) {
vector<int> pts{0}; pts.insert(pts.end(), cuts.begin(), cuts.end()); sort(pts.begin() + 1, pts.end()); pts.push_back(n);
vector<vector<int>> memo(pts.size(), vector<int>(pts.size(), -1));
function<int(int, int)> solve = [&](int i, int j) -> int {
if (j - i < 2) return 0;
if (memo[i][j] != -1) return memo[i][j];
int best = INT_MAX;
for (int k = i + 1; k < j; k++) {
best = min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i]);
}
memo[i][j] = best;
return best;
};
return solve(0, (int)pts.size() - 1);
}
public int minCost(int n, int[] cuts) {
int[] pts = new int[cuts.length + 2];
int[] sorted = cuts.clone(); Arrays.sort(sorted);
for (int i = 0; i < sorted.length; i++) pts[i + 1] = sorted[i];
pts[pts.length - 1] = n;
int[][] memo = new int[pts.length][pts.length];
for (int[] row : memo) Arrays.fill(row, -1);
return solve(pts, memo, 0, pts.length - 1);
}
private int solve(int[] pts, int[][] memo, int i, int j) {
if (j - i < 2) return 0;
if (memo[i][j] != -1) return memo[i][j];
int best = Integer.MAX_VALUE;
for (int k = i + 1; k < j; k++) {
best = Math.min(best, solve(pts, memo, i, k) + solve(pts, memo, k, j) + pts[j] - pts[i]);
}
memo[i][j] = best;
return best;
}
def min_cost(n, cuts):
pts = [0] + sorted(cuts) + [n]
memo = [[-1] * len(pts) for _ in range(len(pts))]
def solve(i, j):
if j - i < 2: return 0
if memo[i][j] != -1: return memo[i][j]
best = float('inf')
for k in range(i + 1, j):
best = min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i])
memo[i][j] = best
return best
return solve(0, len(pts) - 1)
function minCost(n: number, cuts: number[]): number {
const pts = [0, ...[...cuts].sort((a, b) => a - b), n];
const memo = Array.from({ length: pts.length }, () => new Array<number>(pts.length).fill(-1));
const solve = (i: number, j: number): number => {
if (j - i < 2) return 0;
if (memo[i][j] !== -1) return memo[i][j];
let best = Infinity;
for (let k = i + 1; k < j; k++) {
best = Math.min(best, solve(i, k) + solve(k, j) + pts[j] - pts[i]);
}
memo[i][j] = best;
return best;
};
return solve(0, pts.length - 1);
}
int minCost(int n, vector<int>& cuts) {
vector<int> pts{0}; pts.insert(pts.end(), cuts.begin(), cuts.end()); sort(pts.begin() + 1, pts.end()); pts.push_back(n);
int m = pts.size();
vector<vector<int>> dp(m, vector<int>(m, 0));
for (int gap = 2; gap < m; gap++) {
for (int i = 0; i + gap < m; i++) {
int j = i + gap;
int best = INT_MAX;
for (int k = i + 1; k < j; k++) best = min(best, dp[i][k] + dp[k][j]);
dp[i][j] = best + pts[j] - pts[i];
}
}
return dp[0][m - 1];
}
public int minCost(int n, int[] cuts) {
int[] pts = new int[cuts.length + 2];
int[] sorted = cuts.clone(); Arrays.sort(sorted);
for (int i = 0; i < sorted.length; i++) pts[i + 1] = sorted[i];
pts[pts.length - 1] = n;
int m = pts.length;
int[][] dp = new int[m][m];
for (int gap = 2; gap < m; gap++) {
for (int i = 0; i + gap < m; i++) {
int j = i + gap;
int 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 + pts[j] - pts[i];
}
}
return dp[0][m - 1];
}
def min_cost(n, cuts):
pts = [0] + sorted(cuts) + [n]
m = len(pts)
dp = [[0] * m for _ in range(m)]
for gap in range(2, m):
for i in range(0, m - gap):
j = i + gap
best = float('inf')
for k in range(i + 1, j): best = min(best, dp[i][k] + dp[k][j])
dp[i][j] = best + pts[j] - pts[i]
return dp[0][m - 1]
function minCost(n: number, cuts: number[]): number {
const pts = [0, ...[...cuts].sort((a, b) => a - b), n];
const m = pts.length;
const dp = Array.from({ length: m }, () => new Array<number>(m).fill(0));
for (let gap = 2; gap < m; gap++) {
for (let i = 0; i + gap < m; i++) {
const j = i + gap;
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 + pts[j] - pts[i];
}
}
return dp[0][m - 1];
}
int minCost(int n, vector<int>& cuts) {
vector<int> pts{0}; pts.insert(pts.end(), cuts.begin(), cuts.end()); sort(pts.begin() + 1, pts.end()); pts.push_back(n);
int m = pts.size();
vector<vector<int>> dp(m, vector<int>(m, 0));
vector<vector<int>> opt(m, vector<int>(m, 0));
for (int i = 0; i + 1 < m; i++) opt[i][i + 1] = i + 1;
for (int gap = 2; gap < m; gap++) {
for (int i = 0; i + gap < m; i++) {
int j = i + gap;
int lo = max(opt[i][j - 1], i + 1);
int hi = min(opt[i + 1][j], j - 1);
dp[i][j] = INT_MAX;
for (int k = lo; k <= hi; k++) {
int cost = dp[i][k] + dp[k][j] + pts[j] - pts[i];
if (cost < dp[i][j]) { dp[i][j] = cost; opt[i][j] = k; }
}
}
}
return dp[0][m - 1];
}
public int minCost(int n, int[] cuts) {
int[] pts = new int[cuts.length + 2];
int[] sorted = cuts.clone(); Arrays.sort(sorted);
for (int i = 0; i < sorted.length; i++) pts[i + 1] = sorted[i];
pts[pts.length - 1] = n;
int m = pts.length;
int[][] dp = new int[m][m];
int[][] opt = new int[m][m];
for (int i = 0; i + 1 < m; i++) opt[i][i + 1] = i + 1;
for (int gap = 2; gap < m; gap++) {
for (int i = 0; i + gap < m; i++) {
int j = i + gap;
int lo = Math.max(opt[i][j - 1], i + 1);
int hi = Math.min(opt[i + 1][j], j - 1);
dp[i][j] = Integer.MAX_VALUE;
for (int k = lo; k <= hi; k++) {
int cost = dp[i][k] + dp[k][j] + pts[j] - pts[i];
if (cost < dp[i][j]) { dp[i][j] = cost; opt[i][j] = k; }
}
}
}
return dp[0][m - 1];
}
def min_cost(n, cuts):
pts = [0] + sorted(cuts) + [n]
m = len(pts)
dp = [[0] * m for _ in range(m)]
opt = [[0] * m for _ in range(m)]
for i in range(m - 1): opt[i][i + 1] = i + 1
for gap in range(2, m):
for i in range(0, m - gap):
j = i + gap
lo = max(opt[i][j - 1], i + 1)
hi = min(opt[i + 1][j], j - 1)
dp[i][j] = float('inf')
for k in range(lo, hi + 1):
cost = dp[i][k] + dp[k][j] + pts[j] - pts[i]
if cost < dp[i][j]:
dp[i][j] = cost; opt[i][j] = k
return dp[0][m - 1]
function minCost(n: number, cuts: number[]): number {
const pts = [0, ...[...cuts].sort((a, b) => a - b), n];
const m = pts.length;
const dp = Array.from({ length: m }, () => new Array<number>(m).fill(0));
const opt = Array.from({ length: m }, () => new Array<number>(m).fill(0));
for (let i = 0; i + 1 < m; i++) opt[i][i + 1] = i + 1;
for (let gap = 2; gap < m; gap++) {
for (let i = 0; i + gap < m; i++) {
const j = i + gap;
const lo = Math.max(opt[i][j - 1], i + 1);
const hi = Math.min(opt[i + 1][j], j - 1);
dp[i][j] = Infinity;
for (let k = lo; k <= hi; k++) {
const cost = dp[i][k] + dp[k][j] + pts[j] - pts[i];
if (cost < dp[i][j]) { dp[i][j] = cost; opt[i][j] = k; }
}
}
}
return dp[0][m - 1];
}