[leetcode] Triangle

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

 

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

https://oj.leetcode.com/problems/triangle/

 

思路:DP,从最底层递推上去。dp[i][j]表示第i层j个元素为起点的最小路径和。

  递推公式:dp[i][j]=value[i][j]+min{dp[i+1][j],dp[i+1][j+1};

  因为每一层只跟下一层相关,所以只需一维状态即可。

 

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int n = triangle.size();
        int[] dp = new int[n]; // dp[i] 代表从下到第i层最小的路径和
        for (int i = n - 1; i >= 0; i--) {
            for (int j = 0; j <= i; j++) {
                if (i == n - 1)
                    dp[j] = triangle.get(i).get(j);
                else
                    dp[j] = triangle.get(i).get(j) + Math.min(dp[j], dp[j + 1]);
            }
        }

        return dp[0];

    }

    public static void main(String[] args) {
        List<List<Integer>> triangle = new ArrayList<List<Integer>>();
        triangle.add(Arrays.asList(new Integer[] { 2 }));
        triangle.add(Arrays.asList(new Integer[] { 3, 4 }));
        triangle.add(Arrays.asList(new Integer[] { 6, 5, 7 }));
        triangle.add(Arrays.asList(new Integer[] { 4, 1, 8, 3 }));

        System.out.println(new Solution().minimumTotal(triangle));
    }
}

 

 第二遍记录:

先画二维的,然后根据递推顺序转化成一维的。

 

第三遍记录:

  二维和一维都要注意纵坐标的范围,不要越界。

  一维递推的时候注意要 自下而上,自左而右。

 

posted @ 2014-07-03 21:30  jdflyfly  阅读(146)  评论(0编辑  收藏  举报