题目:
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
算法:
方法一:动态规划
划分好情况即可
func minimumTotal(triangle [][]int) int {
// dp[i]保存从三角形顶部,走到底部位置i的最短路径
// dp[i] = min(dp[i], dp[i - 1])
dp := make([]int, len(triangle))
for i := range triangle {
for j := len(triangle[i]) - 1; j >= 0; j-- {
if j == 0 {
dp[j] = dp[j] + triangle[i][j]
} else if j == len(triangle[i]) - 1 && j > 0 {
dp[j] = dp[j - 1] + triangle[i][j]
} else if i > 0 {
dp[j] = min(dp[j], dp[j - 1]) + triangle[i][j]
}
}
// fmt.Println(dp)
}
ans := dp[0]
for i := range dp {
if dp[i] < ans {
ans = dp[i]
}
}
return ans
}
func min(a, b int) int {
if a < b {
return a
}
return b
}