三角形最小路径和

51 阅读1分钟

题目

动态规划

public int minimumTotal(List<List<Integer>> triangle) {

        int height = triangle.size();
        int maxWidth = triangle.get(triangle.size() - 1).size();
        int [][] dp = new int[height][maxWidth];
        for (int i = 0; i < height; i ++) {
            for (int j = 0; j < i + 1; j ++) {
                if (i == 0) {
                    dp[i][j] = triangle.get(i).get(j);
                } else {
                    if (j == 0) {
                        dp [i][j] = triangle.get(i).get(j) + dp[i - 1][j];
                    } else if (j == triangle.get(i).size() - 1) {
                        dp [i][j] = triangle.get(i).get(j) + dp[i - 1][j - 1];
                    } else {
                        dp [i][j] = triangle.get(i).get(j) + Math.min(dp[i - 1][j], dp[i - 1][j - 1]);
                    }

                }
            }
        }
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < maxWidth; i ++) {
            min = Math.min(min, dp[height - 1][i]);
        }
        return min;
    }

基本思路

  1. 首先该问题不是一个最优问题, 因为可达的位置是有限制的, 因此需要按层求出每一层的可能结果

  2. 从第0层开始, 计算到达每一层每个位置的最小路径和, 每一层的计算只和上一层的数据有关, 状态转移方程: dp[i][j] = nums[i][j] + Math.min(dp[i - 1][j], dp[i - 1][j - 1]), 需要注意每一层边界两个元素的计算方式

  3. 最终结果为三角形最后一层的最小值