120. 三角形最小路径和(多维动态规划)

这道题中,除了第一行,其余行中元素路径值由上面元素的最小值加和决定,最终取出最后一行中的最小值即可。

分为三种情况:

  • 最靠左的一列:其路径值取上一行中右边的值dp[i - 1][j]加自己本身的值(因为没有更左边的值)。
  • 最靠右的一列:其路径值取上一行中右边的值dp[i - 1][j - 1]加自己本身的值(因为没有更右边的值)。
  • 其余列:其路径值取上一行中左右两边的最小值Math.min(dp[i - 1][j], dp[i - 1][j - 1])加自己本身的值
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int minPath = Integer.MAX_VALUE;
        // triangle.get(0).size()是第一行的长度,为1
        // int m = triangle.size(), n = triangle.get(0).size();
        int m = triangle.size();
        int[][] dp = new int[m][m];
        dp[0][0] = triangle.get(0).get(0);
        for (int i = 1; i < m; ++i) {
            // for (int j = 0; j < n; ++j) {
            for (int j = 0; j <= i; ++j) {
                if (j == 0) dp[i][j] = dp[i - 1][j] + triangle.get(i).get(j);
                else if (j == i) dp[i][j] = dp[i - 1][j - 1] + triangle.get(i).get(j);
                else dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + triangle.get(i).get(j);
                if (i == m - 1) minPath = Math.min(minPath, dp[i][j]);
            }
        }
        return minPath == Integer.MAX_VALUE ? triangle.get(0).get(0) : minPath; 
    }
}

你可能感兴趣的:(LeetCode,算法,数据结构)