#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param triangle int整型二维数组 
# @return int整型
#
class Solution:
    def minTrace(self , triangle: List[List[int]]) -> int:
        # write code here 用递归回溯DFS会超时
        '''n = len(triangle)
        def dfs(i,j):
            if i == n-1:
                return triangle[i][j]
            return min(dfs(i+1,j),dfs(i+1,j+1))+triangle[i][j]
        return dfs(0,0)'''
        # write code here 用动态规划做
        n = len(triangle)
        dp = triangle[-1]#动态规划数组初始等于最后一行
        for i in range(n-2,-1,-1):#动态规划数组从倒数第二行开始往上更新
            for j in range(i+1):#第i行的元素个数为i+1个(列数)len(triangle[i])
                dp[j] = min(dp[j],dp[j+1])+triangle[i][j]#更新当前行的数
        return dp[0]