import java.util.*;
/**
* NC225 三角形最小路径和
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param triangle int整型二维数组
* @return int整型
*/
public int minTrace (int[][] triangle) {
return solution1(triangle);
// return solution2(triangle);
}
/**
* 动态规划: 二维数组
*
* dp[i][j]表示到达第i行第j列时的最小路径和
*
* { dp[i-1][j]+triangle[i-1][j-1] , j=1
* dp[i][j] = { dp[i-1][j-1]+triangle[i-1][j-1] , j=i
* { Math.min(dp[i-1][j-1]+triangle[i-1][j-1], dp[i-1][j]+triangle[i-1][j-1]) , 1<j<i
*
* @param triangle
* @return
*/
private int solution1(int[][] triangle){
int row = triangle.length;
if(row == 1){
return triangle[0][0];
}
int[][] dp = new int[row+1][row+1];
dp[1][1] = triangle[0][0];
int result = Integer.MAX_VALUE;
for(int i=2; i<=row; i++){
for(int j=1; j<=i; j++){
if(j == 1){
dp[i][j] = dp[i-1][j]+triangle[i-1][j-1];
continue;
}
if(j == i){
dp[i][j] = dp[i-1][j-1]+triangle[i-1][j-1];
continue;
}
dp[i][j] = Math.min(dp[i-1][j-1]+triangle[i-1][j-1], dp[i-1][j]+triangle[i-1][j-1]);
if(i == row){
result = Math.min(result, dp[i][j]);
}
}
}
return result;
}
/**
* 动态规划: 一维数组(空间压缩)
*
* dp[j]表示到达第j列时的最小路径和
*
* { dp[j]+triangle[i-1][j-1] , j=1
* dp[j] = { pre+triangle[i-1][j-1] , j=i
* { Math.min(dp[j]+triangle[i-1][j-1], pre+triangle[i-1][j-1]) , 1<j<i
*
* @param triangle
* @return
*/
private int solution2(int[][] triangle){
int row = triangle.length;
if(row == 1){
return triangle[0][0];
}
int[] dp = new int[row+1];
dp[1] = triangle[0][0];
int result = Integer.MAX_VALUE;
for(int i=2; i<=row; i++){
int pre = dp[1];
for(int j=1; j<=i; j++){
int tmp = dp[j];
if(j == 1){
dp[j] = dp[j]+triangle[i-1][j-1];
continue;
}
if(j == i){
dp[j] = pre+triangle[i-1][j-1];
continue;
}
dp[j] = Math.min(dp[j]+triangle[i-1][j-1], pre+triangle[i-1][j-1]);
if(i == row){
result = Math.min(result, dp[j]);
}
pre = tmp;
}
}
return result;
}
}