1
var minimumFinishTime = function (tires, changeTime, numLaps) {2
const n = tires.length;3
const smallestTire = Math.min(...tires.map((t) => t[1]));5
Math.floor(Math.log(changeTime) / Math.log(smallestTire)) + 1;6
const sameTireLast = Array(n).fill(0);8
// DP array tracking what is the min cost to complete lap i using same tire9
const sameTire = Array(maxSameTire + 1).fill(Infinity);10
for (let lap = 1; lap <= maxSameTire; lap++) {11
tires.forEach((tire, i) => {12
sameTireLast[i] += tire[0] * tire[1] ** (lap - 1);13
sameTire[lap] = Math.min(sameTire[lap], sameTireLast[i]);17
const dp = Array(numLaps + 1).fill(Infinity);18
for (let i = 1; i < numLaps + 1; i++) {19
if (i <= maxSameTire) dp[i] = sameTire[i];20
// at each lap, we can either use the same tire up to this lap (sameTire[i])21
// or a combination of 2 different best times,22
// eg lap 6: use best time from lap 3 + lap 323
// or from lap 4 + lap 225
for (let j = 1; j < i / 2 + 1; j++) {26
dp[i] = Math.min(dp[i], dp[i - j] + changeTime + dp[j]);