publicintminPathSum3(int[][] grid){ int m = grid.length; int n = grid[0].length; int[] dp = newint[n]; dp[0] = grid[0][0]; for (int i = 1; i < n; i++) { dp[i] = dp[i - 1] + grid[0][i]; }
for (int i = 1; i < m; i++) { for (int j = 0; j < n; j++) { if (j == 0){ dp[j] = dp[j] + grid[i][j]; continue; } dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; } }
publicstaticintshortestCoffeeCup(int[] coffee, int n, int a, int b){
// 最小堆 0位置放置结束时间, 1位置放置机器做咖啡的实际,2者相加最小的就是堆顶 PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() { @Override publicintcompare(int[] o1, int[] o2){ return (o1[0] + o1[1]) - (o2[0] + o2[1]); } }); for (int i = 0; i < coffee.length; i++) { queue.add(newint[]{0, coffee[i]}); }
// 计算每个人的终止时间 int[] drinks = newint[n]; for (int i = 0; i < n; i++) { int[] drink = queue.poll(); drink[0] += drink[1]; drinks[i] = drink[0]; queue.add(drink); }
// 递归计算最小值 // return process(drinks, a, b, 0, 0); return getMinTime(drinks, a, b); }
// a洗咖啡杯时间 b自动挥发的实际 washLine洗碗机空闲空闲的时间 publicstaticintprocess(int[] drinks, int a, int b, int index, int washLine){ if (index == drinks.length - 1) { return Math.min(Math.max(washLine, drinks[index]) + a, drinks[index] + b); } // 放咖啡机洗 int wash = Math.max(washLine, drinks[index]) + a; // 洗完剩下的咖啡杯最早结束时间 int next1 = process(drinks, a, b, index + 1, wash); int p1 = Math.max(wash, next1);
// 自动挥发 int dry = drinks[index] + b; int next2 = process(drinks, a, b, index + 1, washLine); int p2 = Math.max(dry, next2); return Math.min(p1, p2); }
// index 0 - n-1 // washLine drinks[0] + na drinks[1] +(n-1)a 最大值 或者 最后一个时间点 + na publicstaticintgetMinTime(int[] drinks, int a, int b){ int n = drinks.length; int[][] dp = newint[n][drinks[n - 1] + n * a]; // basecase for (int i = 0; i < dp[0].length; i++) { // i就是washLine dp[n - 1][i] = Math.min(Math.max(i, drinks[n - 1]) + a, drinks[n - 1] + b); } for (int row = n - 2; row >= 0; row--) { int washLine = drinks[row] + (row + 1) * a; for (int col = 0; col < washLine; col++) { int wash = Math.max(col, drinks[row]) + a; // 2种取最优解 dp[row][col] = Math.min(Math.max(wash, dp[row + 1][wash]), Math.max(drinks[row] + b, dp[row + 1][col])); } } return dp[0][0]; }