LeetCode -- Tiangle

Question:

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).

 

Analysis:

 给出一个三角形,找到从顶部到底部的最小路径。每次跨行移动时只能在相邻的元素间移动。示例如上。

显然用DP,初始条件dp[0][0] = 顶部第一个元素。

状态转移方程为:

dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];

当然要注意每行的最后一个元素和第一个元素,只有一个来源。

最后再找出最后一行中最小的数值即可。

本来是很简单的,但是由于是List取数时没有数组方便,因此调bug花了一些时间。。。

 

代码如下:

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle == null || triangle.size() == 0)
            return 0;
        if(triangle.size() == 1)
            return triangle.get(0).get(0);
        List<ArrayList<Integer>> dp = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> dp0 = new ArrayList<Integer>();
        dp0.add(triangle.get(0).get(0));
        dp.add(dp0);
        int row = triangle.size();
        for(int i=1; i<row; i++ ) {
            ArrayList<Integer> dpi = dp.get(i-1);
            List<Integer> tempi = triangle.get(i);
            ArrayList<Integer> dpii = new ArrayList<Integer>();
            int col = tempi.size();
            for(int j=0; j<col; j++) {
                if(j == 0) 
                    dpii.add(dpi.get(j)+tempi.get(0));
                else if(j < dpi.size()){
                    dpii.add(Math.min(dpi.get(j-1), dpi.get(j)) + tempi.get(j));
                }
                else
                   dpii.add(dpi.get(j-1) + tempi.get(j));
            }
            dp.add(dpii);
        }
        int min = Integer.MAX_VALUE;
        dp0.clear();
        dp0 = dp.get(dp.size()-1);
        for(int i=0; i<dp0.size(); i++)
            if(min > dp0.get(i))
                min = dp0.get(i);
        return min;
    }
}

 

posted @ 2016-04-11 21:41  江湖小妞  阅读(234)  评论(0编辑  收藏  举报