题目

类型:动态规划
image.png

解题思路

代码

  1. class Solution {
  2. public int minFallingPathSum(int[][] matrix) {
  3. //1、初始化dp数组,dp数组用来存储当前位置的最小和
  4. int[][] dp = new int[matrix.length][matrix[0].length];
  5. //2、初始化返回值
  6. int res = Integer.MAX_VALUE;
  7. //3、遍历输入的二维数组
  8. for (int i = 0; i < matrix.length; i++) {
  9. for (int j = 0; j < matrix[0].length; j++) {
  10. //4、赋值当前遍历到的元素
  11. int cur = matrix[i][j];
  12. //5、如果第一行,dp的最小和就是元素本身
  13. if (i == 0) {
  14. dp[i][j] = matrix[i][j];
  15. //6、如果非第一行,是最左列,dp的最小和就是两种答案比大小 (当前元素+上方)、(当前元素+右上方)
  16. } else if (j == 0) {
  17. int upper = dp[i - 1][j];
  18. int upperRight = dp[i - 1][j + 1];
  19. dp[i][j] = Math.min(upper + cur, upperRight + cur);
  20. //7、如果非第一行,非最左列,是最右列,dp的最小和就是两种答案比大小 (当前元素+上方)、(当前元素+左上方)
  21. } else if (j == matrix[0].length - 1) {
  22. int upper = dp[i - 1][j];
  23. int upperLeft = dp[i - 1][j - 1];
  24. dp[i][j] = Math.min(upper + cur, upperLeft + cur);
  25. //8、如果非第一行,非第一列,非最右列,处于中间地带,dp的最小和就是三种答案比大小 (当前元素+左上方)、(当前元素+上方)、(当前元素+右上方)
  26. } else {
  27. int upper = dp[i - 1][j];
  28. int upperLeft = dp[i - 1][j - 1];
  29. int upperRight = dp[i - 1][j + 1];
  30. dp[i][j] = min(upper + cur, upperLeft + cur, upperRight + cur);
  31. }
  32. }
  33. }
  34. //9、遍历dp数组最下方一行,取最小值即为答案
  35. for (int j = 0; j < dp[0].length; j++) {
  36. res = Math.min(res, dp[dp.length - 1][j]);
  37. }
  38. return res;
  39. }
  40. public int min(int a,int b,int c){
  41. int res = Math.min(a,b);
  42. res = Math.min(res,c);
  43. return res;
  44. }
  45. }