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; } }