题目链接

下降路径最小和

题目描述

image.png

实现代码

动态规划思想:记dp[i][j]为到达(i,j)位置的下降路径最小和,首先初始化条件:

  1. dp[0][j] = matrix[0][j]

状态转移方程考虑三种情况:

  1. j == 0时:dp[i][j] = max(dp[i-1][j], dp[i-1][j+1]) + matrix[i][j]
  2. j == n-1时:dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + matrix[i][j]
  3. 其他情况时:dp[i][j] = max(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1]) + matrix[i][j]

实现代码:

  1. class Solution {
  2. public int minFallingPathSum(int[][] matrix) {
  3. int m = matrix.length;
  4. int n = matrix[0].length;
  5. int[][] dp = new int[m][n];
  6. int min = 10001;
  7. for (int j = 0; j < n; j++) {
  8. dp[0][j] = matrix[0][j];
  9. min = Math.min(min, dp[0][j]);
  10. }
  11. if(m == 1) {
  12. return min;
  13. }
  14. min = 10001;
  15. for (int i = 1; i < m; i++) {
  16. for (int j = 0; j < n; j++) {
  17. if (j == 0) {
  18. dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j + 1]) + matrix[i][j];
  19. } else if (j == n - 1) {
  20. dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + matrix[i][j];
  21. } else {
  22. dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i][j];
  23. }
  24. min = (i == m - 1 ? Math.min(min, dp[i][j]) : min);
  25. }
  26. }
  27. return min;
  28. }
  29. }

二维数组的基础上进行一维数组降维优化,实现代码:

  1. public int minFallingPathSum(int[][] matrix) {
  2. int n = matrix.length;
  3. int dp[] = new int[n];
  4. int ans = Integer.MAX_VALUE;
  5. for(int i = 0;i < n;i++){
  6. int pre = 0;
  7. for(int j = 0;j < n;j++){
  8. int num = matrix[i][j];
  9. int tmp = dp[j];
  10. if(i == 0) dp[j] = num;
  11. else if(j == 0) dp[j] = Math.min(dp[j],dp[j+1])+num;
  12. else if(j == n-1) dp[j] = Math.min(dp[j],pre)+num;
  13. else dp[j] = Math.min(pre,Math.min(dp[j+1],dp[j]))+num;
  14. if(i == n-1){
  15. ans = Math.min(ans,dp[j]);
  16. }
  17. pre = tmp;
  18. }
  19. }
  20. return ans;
  21. }