import java.util.*; public class Solution { // 每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点 public int minTrace (int[][] triangle) { // write code here if (triangle.length == 1) { return triangle[0][0]; } int n = triangle.length; // 二维dp,算出每一个位置的最小路径和 // 二维dp是用于存储每个位置上的最小路径和,之后通过比较各个最小路径,来确定最小的那个 int[][] dp = new int[n][n]; dp[0][0] = triangle[0][0]; for (int i = 1; i < triangle.length; i++) { for(int j = 0; j <= i; j++){ // j == 0 和 j == i都是边界条件 if(j == 0){ dp[i][0] = dp[i - 1][0] + triangle[i][0]; }else if(j == i){ dp[i][j] = dp[i - 1][j - 1] + triangle[i][j]; }else{ dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]; } } } int res = dp[n - 1][0]; for(int i = 1; i < n; i++){ res = Math.min(res, dp[n - 1][i]); } return res; } }