//自底向上的解法
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
//加一行是为了方便dp数组最后一行的赋值(dp最后一行就是三角形列表最后一行)
int[][] dp=new int[triangle.size()+1][triangle.size()+1];
for(int i=triangle.size()-1;i>=0;i--){
List<Integer> curLine=triangle.get(i);
for(int j=0;j<curLine.size();j++){
dp[i][j]=Math.min(dp[i+1][j],dp[i+1][j+1])+curLine.get(j);
}
}
return dp[0][0];
}
}
只使用一维数组:
int[] dp = new int[triangle.size()+1];
for (int i = triangle.size() - 1; i >= 0; i--) {
List<Integer> curTr = triangle.get(i);
for (int j = 0; j < curTr.size(); j++) {
//这里dp[j]遍历每一行的时候都在变化,关键是理解下一行
dp[j] = Math.min(dp[j],dp[j+1]) + curTr.get(j);
}
}
return dp[0];