关键点
- 递推!(递归+记忆化)
状态定义:opt[n],重中之重!
状态转移方程:opt[n] = bestOf(opt[n-1], opt[n-2], ...)
- 最优子结构
比较
回溯(递归)- 重复计算,通常找不到最优子结构。
贪心 - 永远局部最优,局部最优不一定是全局最优。
动态规划 - 记录局部最优子机构(避免重复计算,再通过状态转移方程再递推下一个),集上述两者优点。
题目
leetcode 120. 三角形最小路径和
func minimumTotal(triangle [][]int) int {
n := len(triangle)
mini := triangle[n-1]
// 从下往上进行变例
for i:= n-2;i>=0;i--{
for j :=0; j < len(triangle[i]);j++ {
// mini[j]使用一次,所以可以直接修改
mini[j] = triangle[i][j] + min(mini[j],mini[j+1])
}
}
return mini[0]
}