题目描述:
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
样例
比如,给出下列数字三角形:
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。
很明显这是一道动态规划题。
其满足两个条件 :最优子结构与无后效性。
确定状态:我们使用 temp[i][j] 表示triangle[i][j] 点到底部的路径最小值。
状态转移方程为: temp[i][j]=min(temp[i-1][j-1],temp[i-1][j])+triangle[i][j];
由此确定代码
但是为什么没有通过??? 角标越界???
public class Solution {
/**
* @param triangle: a list of lists of integers.
* @return: An integer, minimum path sum.
*/
public int minimumTotal(int[][] triangle) {
// write your code here
int len1=triangle.length;
int len2=triangle[0].length;
int[][] temp=new int[len1][len2];
temp[0][0]=triangle[0][0];
for(int i=1;i<len1;i++){
for(int j=0;j<=i;j++){
if(j==0)
temp[i][j]=temp[i-1][j]+triangle[i][j];
else if(j==i)
temp[i][j]=temp[i-1][j-1]+triangle[i][j];
else
temp[i][j]=Math.min(temp[i-1][j-1],temp[i-1][j])+triangle[i][j];
}
}
int res=temp[len1-1][0];
for(int j=0;j<len1;j++){
if(temp[len1-1][j]<res)
res=temp[len1-1][j];
}
return res;
}
}
使用一维数组储存则通过
public class Solution {
/**
* @param triangle: a list of lists of integers.
* @return: An integer, minimum path sum.
*/
public int minimumTotal(int[][] triangle) {
// write your code here
int len1=triangle.length;
int len2=triangle[0].length;
int[] temp=new int[len1];
temp[0]=triangle[0][0];
for(int i=1;i<len1;i++){
for(int j=i;j>=0;j--){
if(j==0)
temp[0]=temp[0]+triangle[i][j];
else if(j==i)
temp[j]=temp[j-1]+triangle[i][j];
else
temp[j]=Math.min(temp[j-1],temp[j])+triangle[i][j];
}
}
int res=temp[0];
for(int j=0;j<len1;j++){
if(temp[j]<res)
res=temp[j];
}
return res;
}
}