#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param triangle int整型二维数组 
# @return int整型
#

#1.线性dp
class Solution:
    def minTrace(self , triangle: List[List[int]]) -> int:
        # write code here
        #逆向思维,自底向上
        dp=triangle[-1]
        n=len(triangle)
        for i in range(n-2,-1,-1):#从倒数第二行开始
            for j in range(len(triangle[i])): #必须正向,避免覆盖
                dp[j]=min(dp[j],dp[j+1])+triangle[i][j]
        return dp[0]

#1. 二维dp的求解思路
# class Solution:
#     def minTrace(self , triangle: List[List[int]]) -> int:
#         # write code here

#         #dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
#         dp=triangle
#         for i in range(1,len(triangle)):
#             for j in range(len(triangle[i])):                 
#                 if j==0:
#                     dp[i][j]=dp[i-1][j]+triangle[i][j]
#                 elif j==len(triangle[i])-1:
#                     dp[i][j]=dp[i-1][j-1]+triangle[i][j]
#                 else:
#                      dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j]
#         return min(dp[len(triangle)-1])