image.png
    状态定义:dp[i][j] 表示到达 (i,j)处的最小数字和

    问题目标:max(dp数组的最后一行的元素)

    状态转移dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j + 1]) + matrix[i][j]

    状态初始化:dp 的第一行 等于 arr的第一行

    时间复杂度:O(m * n)

    空间复杂度:O(n * n) ——可优化

    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. //初始化dp
    7. for(int i = 1; i < m; i++){
    8. for(int j = 0; j < n ; j++){
    9. int left = j - 1 >= 0 ? matrix[i - 1][j - 1] : Integer.MAX_VALUE;
    10. int top = matrix[i - 1][j];
    11. int right = j + 1 < n ? matrix[i - 1][j + 1] : Integer.MAX_VALUE;
    12. matrix[i][j] = Math.min(left, Math.min(top, right)) + matrix[i][j];
    13. }
    14. }
    15. int ans = Integer.MAX_VALUE;
    16. for(int i = 0; i < n; i++){
    17. ans = Math.min(ans, matrix[m - 1][i]);
    18. }
    19. return ans;
    20. }
    21. }