2
public int boxDelivering(int[][] boxes, int portsCount, int maxBoxes, int maxWeight) {3
int[] diffCity = new int[boxes.length + 1];4
int[] weights = new int[boxes.length + 1];6
for (int i = 0; i < boxes.length; i++) {7
diffCity[i + 1] = diffCity[i] + ((i != 0 && boxes[i][0] == boxes[i - 1][0]) ? 0 : 1);8
weights[i + 1] = weights[i] + boxes[i][1];10
int[] dp = new int[boxes.length + 1];11
Arrays.fill(dp, Integer.MAX_VALUE);14
for (int i = 1; i <= boxes.length; i++) { // offset by 1 since our above logic reaches dp[-1]15
for (int j = i - 1; j >= 0; j--) {18
- diffCity[j + 1]; // computes # of different cities from i to j. (add 1 to j is20
int w = weights[i] - weights[j];22
if (b <= maxBoxes && w <= maxWeight) {23
dp[i] = Math.min(dp[i], 2 + dC + dp[j]);27
return dp[boxes.length];