import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param triangle int整型二维数组
* @return int整型
*/
public int minTrace (int[][] triangle) {
// write code here
//两种实现:从上往下和从下往上
//从上往下是每到一行,在数组中更新路径为自身值+上一行的可接触值的路径的最小值,
//这种方法要注意边界条件
//最后会得到以最后一行的每个点为终点的路径和最小值,从中找出最小的即可。
//从下往上是每到一行,在数组中更新路径为自身值+下一行的可接触值的路径的最小值,
//最后dp【0】就是所要的值
//要想更节省空间,可以不建新数组,在原数组上修改即可。
//int min = Top2Bot(triangle);
int min = Bot2Top(triangle);
return min;
}
public int Top2Bot(int[][] triangle){
//从上往下
int[] dp = new int[triangle.length];
dp[0] = triangle[0][0];
for(int i = 1; i < triangle.length; i++){
for(int j = i; j >=0; j--){
if(j == i){
dp[j] = dp[j-1] + triangle[i][j];
}else if(j == 0){
dp[j] = dp[j] + triangle[i][j];
}else{
dp[j] = Math.min(dp[j-1],dp[j]) + triangle[i][j];
}
}
}
int min = Integer.MAX_VALUE;
for(int i = 0; i < dp.length; i++){
min = Math.min(min,dp[i]);
}
return min;
}
public int Bot2Top(int[][] triangle){
//从下往上
int[] dp = Arrays.copyOf(triangle[triangle.length-1], triangle.length);
for(int i = triangle.length - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
dp[j] = Math.min(dp[j], dp[j+1]) + triangle[i][j];
}
}
return dp[0];
}
}