思路:
以
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
为例:
假设从倒数第二列开始,
,6变成6+min(4,1)=7,5变成5+min(1,8)=6,7变成7+min(8,3)=10;这应该很好理解,当你选择的路径让你到达6时,接下来你可以选择4或者1,那么你自然会选择更小的1;当你选择的路径让你到达5时,接下来你可以选择1或者8,那么你自然会选择更小的1;当你选择的路径让你到达7时,接下来你可以选择8或者3,那么你自然会选择更小的3。
因此,可以把原来的lists变成
[
[2],
[3,4],
[7,6,10],
[4,1,8,3]
]
继续向上操作,即操作倒数第三行,可以把lists变成
[
[2],
[9,10],
[7,6,10],
[4,1,8,3]
]
继续向上操作,即操作倒数第四行,可以把lists变成
[
[11],
[9,10],
[7,6,10],
[4,1,8,3]
]
最后,返回顶部的值。
class Solution { public int minimumTotal(List<List<Integer>> triangle) { if(triangle==null||triangle.size()==0) return 0; int [][]dp=new int [triangle.size()+1][triangle.size()+1];//初始化所有节点为零,这样最后一行无需初始化,在这里我们不直接操作原List。 for(int i=triangle.size()-1;i>=0;i--)//从最后一行开始,因为dp初始化的时候多了一行,多的一行都是0,不影响的 { List<Integer> cur=triangle.get(i);//获得第i层 for(int j=0;j<cur.size();j++) { dp[i][j]=Math.min(dp[i+1][j],dp[i+1][j+1])+cur.get(j);//当前层的元素,是下一层相邻元素里较小的那一个再加上本元素,下一层相邻元素,的下标是j,j+1 } } return dp[0][0]; } }