题目
思路
和不同路径差不多,不多说
代码
//1.暴力递归public int minPathSum(int[][] grid) {return recur(grid, grid.length - 1, grid[0].length - 1);}public int recur(int[][] grid, int i, int j) {if (i == 0 && j == 0) return grid[i][j];if (i < 0 || j < 0) return Integer.MAX_VALUE;return Math.min(recur(grid, i - 1, j), recur(grid, i, j - 1)) + grid[i][j];}//2.备忘录int[][] dp;public int minPathSum(int[][] grid) {dp = new int[grid.length][grid[0].length];return recur(grid, grid.length - 1, grid[0].length - 1);}public int recur(int[][] grid, int i, int j) {if (i == 0 && j == 0) return grid[i][j];if (i < 0 || j < 0) return Integer.MAX_VALUE;if (dp[i][j] != 0) return dp[i][j];dp[i][j] = Math.min(recur(grid, i - 1, j), recur(grid, i, j - 1)) + grid[i][j];return dp[i][j];}//3.动态规划public int minPathSum(int[][] grid) {if (grid.length == 0) return 0;int[][] dp = new int[grid.length][grid[0].length];dp[0][0] = grid[0][0];for (int i = 1; i < grid.length; i++) {dp[i][0] += dp[i - 1][0] + grid[i][0];}for (int j = 1; j < grid[0].length; j++) {dp[0][j] += dp[0][j - 1] + grid[0][j];}for (int i = 1; i < grid.length; i++) {for (int j = 1; j < grid[0].length; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}}return dp[grid.length - 1][grid[0].length - 1];}//4.动态规划,优化dp数组public int minPathSum(int[][] grid) {if (grid.length == 0) return 0;int[] dp = new int[grid[0].length];dp[0] = grid[0][0];for (int j = 1; j < grid[0].length; j++) {dp[j] += dp[j - 1] + grid[0][j];}for (int i = 1; i < grid.length; i++) {dp[0] += grid[i][0];for (int j = 1; j < grid[0].length; j++) {dp[j] = Math.min(dp[j], dp[j - 1]) + grid[i][j];}}return dp[grid[0].length - 1];}
