120. Triangle

很简单的题目,一看就是DP。

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if (triangle.size() == 0)
            return 0;
        if (triangle.size() == 1)
            return triangle.get(0).get(0);

        int size = triangle.size();
        // dp[i][j]表示达到第i行第j个节点所需要的最小路径
        int[][] dp = new int[size][size];
        // 初始状态
        dp[0][0] = triangle.get(0).get(0);

        int min = Integer.MAX_VALUE;
        for (int i = 1; i < size; i++) {
            for (int j = 0; j <= i; j++) {
                int thisValue = triangle.get(i).get(j);
                // 注意边界条件,两边的元素要特殊处理下
                if (j == 0) {
                    dp[i][j] = dp[i - 1][j] + thisValue;
                } else if (j == i) {
                    dp[i][j] = dp[i - 1][j - 1] + thisValue;
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + thisValue;
                }

                // 如果是最后一行了
                if (i == size - 1) {
                    min = Math.min(min, dp[i][j]);
                }
            }
        }

        return min;
    }
}

results matching ""

    No results matching ""