/*
空间o(n*n)
动态规划
从下往上填表格
先把最后一行都填写到memo里面
上面每一个格子都是表示 下一层与他临近的两个里面小的那个数加上本身
一只到memo[0][0];
*/
// class Solution {
// public int minimumTotal(List<List<Integer>> triangle) {
// if(triangle == null || triangle.size() == 0 || triangle.get(0).size() == 0) return 0;
// int[][] memo = new int[triangle.size()][triangle.size()];
// for(int i = 0; i < triangle.size(); i++) {
// memo[triangle.size() - 1][i] = triangle.get(triangle.size() - 1).get(i);
// }
// for(int i = triangle.size() - 2; i >= 0; i--) {
// for(int j = 0; j <= i; j++) {
// memo[i][j] = Math.min(memo[i + 1][j], memo[i + 1][j + 1]) + triangle.get(i).get(j);
// }
// }
// return memo[0][0];
// }
// }
/*
优化到o(n)
*/
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle == null || triangle.size() == 0 || triangle.get(0).size() == 0) return 0;
int[] memo = new int[triangle.size()];
for(int i = 0; i < triangle.size(); i++) {
memo[i] = triangle.get(triangle.size() - 1).get(i);
}
for(int i = triangle.size() - 2; i >= 0; i--) {
for(int j = 0; j <= i; j++) {
memo[j] = Math.min(memo[j], memo[j + 1]) + triangle.get(i).get(j);
}
}
return memo[0];
}
}