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).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
思路:动态规划,设发f[i,j]表示从位置(i,j)出发到达三角形底部的最小路径和,所以状态转移方程有:
f[i,j]=min(f[i+1,j],f[i+1,j+1]) (i<size-1&&i>=0,j<i+1);
参考代码:
1 public class Solution { 2 public static int minimumTotal(ArrayList<ArrayList<Integer>> triangle) { 3 int trianlgesize=triangle.size(); 4 int dp[][]=new int[trianlgesize][trianlgesize]; 5 for(int i=0;i<triangle.get(trianlgesize-1).size();i++){ 6 dp[trianlgesize-1][i]=triangle.get(trianlgesize).get(i); 7 } 8 for(int i=trianlgesize-2;i>=0;i--){ 9 for(int j=0;j<i+1;j++){ 10 dp[i][j]=Math.min(dp[i+1][j], dp[i+1][j+1])+triangle.get(i).get(j); 11 } 12 } 13 return dp[0][0]; 14 } 15 }