题目:
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.
分析:
这道题属于动态规划问题中找最小值问题。用动态规划四步分析法分析:
1. 状态代表到这个位置的最小值
2. 每个状态都从下一行相邻的两个元素中较小的加上当前的值得到,状态转移方程:f[i][j] = min(f[i+1][j] + f[i+1][j+1]) + value[i][j]
3. 初始值为最后一行的值
4. 答案 f[0][0]
Java代码实现:
public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle==null || triangle.size()==0)
return 0;
int size = triangle.size();
int[][] count = new int[size][size];
for(int i=0;i<size;i++)
count[size-1][i] = triangle.get(size-1).get(i);
for(int i=size-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
count[i][j] = Math.min(count[i+1][j], count[i+1][j+1])+triangle.get(i).get(j);
}
}
return count[0][0];
}
}