4
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {5
this.changeTime = changeTime;6
int[] minTime = new int[numLaps + 1];7
Arrays.fill(minTime, Integer.MAX_VALUE);9
for (int[] tire : tires) {10
populateMinTime(tire, minTime);13
int[] dp = new int[numLaps + 1];14
for (int i = 1; i <= numLaps; i++) {16
minTime[i]; // maxValue for dp[i] is Integer.MAX_VALUE, no need to worry about overflow17
for (int j = 1; j < i; j++) {23
+ dp[i - j]); // it will never overflow, since dp[j] are far less than30
private void populateMinTime(int[] tire, int[] minTime) {35
for (int i = 1; i < minTime.length; i++) {36
spent = (i == 1) ? base : spent * ex;37
if (spent > changeTime + base) {41
minTime[i] = Math.min(minTime[i], sum);