import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *dp非常好!你想通过 在 dp 表中增加一行 0 和一列 0,来简化边界判断和状态转移逻辑,并且希望:

✅ 让 dp[i][j] 表示从顶部到第 i 行、第 j 列的最小路径和

✅ 并且使用 dp[0][0] 或者额外的一行/列来处理边界情况

🎯 目标:
让 dp[n][j] 表示第 n 行所有位置的最小路径和(即最后一行),并避免写复杂的边界条件。
在dp表加一行0再加一列0,使dp[n][j]直接表示n行的最小值,不用dp[n - 1][j]
     * @param triangle int整型二维数组 
     * @return int整型
     */
    public int minTrace (int[][] triangle) {
       
     if(triangle.length==1){
        return triangle[0][0];
     }

        int n=triangle.length;
        //n行n列
        int dp[][]=new int[n+1][n+1];
  // 初始化第一行
        dp[1][1] =triangle[0][0] ;
        for(int i=2;i<=n;i++){
            for(int k=1;k<=i;k++){
                if(k==1){
                     // 最左边只能从上一行的0位置下来
                    dp[i][k] = dp[i - 1][k] + triangle[i-1][k-1];
                }else if(k==i){
                // 最右边只能从上一行的j-1位置下来
                    dp[i][k] = dp[i - 1][k - 1] + triangle[i-1][k-1];
                }else{
                dp[i][k]=Math.min(dp[i-1][k],dp[i-1][k-1])+triangle[i-1][k-1];}
            }
        }
        int minnum=Integer.MAX_VALUE;

        for(int k=1;k<=n;k++){
        if(dp[n][k]<minnum){
            minnum=dp[n][k];
        }
    }
    return minnum;
}
}