funcminPathSum(grid [][]int)int{
m, n :=len(grid),len(grid[0])// 缓存
dp :=make([][]int,2)for i :=range dp {
dp[i]=make([]int, n)}// 初始值(最小问题解)
sum :=0for i :=0; i < n; i++{
sum += grid[0][i]
dp[0][i]= sum
}// 计算for i :=1; i < m; i++{// 新的一行
dp[i%2][0]= dp[(i-1)%2][0]+ grid[i][0]for j :=1; j < n; j++{
dp[i%2][j]=min(dp[(i-1)%2][j], dp[i%2][j-1])+ grid[i][j]}}return dp[(m-1)%2][n-1]}funcmin(a, b int)int{if a < b {return a
}return b
}
funcminPathSum(grid [][]int)int{
m, n :=len(grid),len(grid[0])// 缓存
dp :=make([]int, n)// 初始值, 最小问题解
dp[0]= grid[0][0]for i :=1; i < n; i++{
dp[i]= dp[i-1]+ grid[0][i]}// 计算for i :=1; i < m; i++{// 新的一行
dp[0]+= grid[i][0]for j :=1; j < n; j++{
dp[j]=min(dp[j-1], dp[j])+ grid[i][j]}}return dp[n-1]}funcmin(a, b int)int{if a < b {return a
}return b
}
funcminimumTotal(triangle [][]int)int{// 三角形的底边长度
n :=len(triangle[len(triangle)-1])// 缓存
dp :=make([]int, n)// 计算for i :=0; i < n; i++{// 缓存 f(i-1,j-1)
prev := dp[0]for j :=0; j <= i; j++{
cur :=0// 缓存计算结果if j ==0{
cur = dp[j]+ triangle[i][j]}elseif i == j {
cur = prev + triangle[i][j]}elseif i > j {
cur =min(dp[j], prev)+ triangle[i][j]}
prev = dp[j]// 缓存之前的结果
dp[j]= cur // 保存计算结果}}
res := dp[0]for_, v :=range dp {
res =min(res, v)}return res
}funcmin(a, b int)int{if a < b {return a
}return b
}