Memorization Search
自顶向下的动态规划——记忆化搜索
记忆化搜索好解决不常见状态转移方程的dp问题
198. 打家劫舍
方法一:DP
1 | |
方法二:DP + 滚动数组
由状态转移方程可以看出,dp[i]由前面两个状态得出,所以dp数组的长度只需要为3
1 | |
方法三:记忆化搜索
自顶向下,举个例子nums=[1,2,3,1]
返回的答案为dfs(3, nums)
要求,需要知道dfs(3-1,nums)与dfs(3-2,nums)+nums[3],然后取最大值
求dfs(2,nums),需要知道dfs(2-1,nums)与dfs(2-2,nums)+nums[2],然后取最大值
.......
1 | |
二刷记忆化搜索
1 | |
方法四:回溯
1 | |
213. 打家劫舍 II
方法一:DP
1 | |
方法二:DP + 滚动数组
1 | |
方法三:记忆化搜索
1 | |

二刷记忆化搜索
1 | |

方法一:DP
1 | |
方法二:乱写的的dfs
1 | |
方法三:记忆化搜索
1 | |
494. 目标和

方法一:01背包
1 | |

方法二:回溯
使用sum,对sum作加操作,相当于对target作减操作
1 | |
方法三:回溯的另一种写法
1 | |
更加精简的回溯
1 | |
方法四:记忆化搜索
- 相比回溯,使用数组记录已经计算过的结果,return前先赋值给数组memo
- 每次遍历时,首先检查memo中是否已经有结果(已经计算过了),有结果直接返回结果
1 | |
二刷记忆化搜索

需要多开辟一点数组空间
1 | |
方法一:回溯超时
1 | |
方法二:记忆化搜索
1 | |

二刷记忆化搜索
1 | |

62. 不同路径
方法一:记忆化搜索
1 | |

二刷记忆化搜索
1 | |
63. 不同路径 II
方法一:记忆化搜索
obstacleGrid[i][j] == 1的判断要在if (i == 0 && j == 0)上面,不然会报如下错

1 | |

二刷记忆化搜索
1 | |

方法一:DP
1 | |
方法二:回溯(超时)
1 | |
方法二:记忆化搜索
dp[i]:从下标i到结尾,是否拼接出单词
1 | |
397. 整数替换
方法一:记忆化搜索
1 | |

55. 跳跃游戏
方法一:记忆化搜索
1 | |
方法二:贪心
1 | |
方法三:回溯(超时)
1 | |
二刷记忆化搜索
1 | |
45. 跳跃游戏 II

1 | |
方法二:贪心
322. 零钱兑换
方法一:记忆化搜索
1 | |
方法二:完全背包
518. 零钱兑换 II

方法一:完全背包
方法二:回溯(超时)
1 | |
回溯另一种写法
1 | |
方法三:记忆化搜索
需要用二位数组存储当前amount,与遍历到的下标
1 | |
343. 整数拆分
方法一:记忆化搜索
1 | |

res = Math.max(res, Math.max(i * (n - i), dfs(n - i) * i));这一句后面为什么不是dfs(n - i) * dfs(i)
比如

如果dfs(i) * dfs(k),那么6和2会被拆分成3, 3,1
121. 买卖股票的最佳时机
方法一:贪心
1 | |
方法二:回溯
1 | |
如果摸不着头脑救去debug吧!
debug版本
1 | |
方法三:记忆化搜索
1 | |
122. 买卖股票的最佳时机 II
记忆化搜索
1 | |
123. 买卖股票的最佳时机 III
记忆化搜索
1 | |
188. 买卖股票的最佳时机 IV
记忆化搜索
1 | |
714. 买卖股票的最佳时机含手续费
记忆化搜索
卖的时候 - fee 或者 买的时候 - fee都可以
1 | |
309. 最佳买卖股票时机含冷冻期
记忆化搜索
卖出:index + 2
base case : index >= prices.length
1 | |
获得分数的方法数

方法一:记忆化搜索(分组背包)
1 | |
1981. 最小化目标值与所选元素的差

方法一:记忆化搜索
1 | |
访问数组中的位置使分数最大

139. 单词拆分

方法一:记忆化搜索
1 | |
300. 最长递增子序列2

方法一:记忆化搜索(选或不选)
注意额外处理第一个位置
1 | |
方法二:记忆化搜索(枚举选哪个)
dp不用重复初始化,因为记忆化的是增量
1 | |
方法三:DP
1 | |
416. 分割等和子集

方法一:记忆化搜索
1 | |

二刷记忆化搜索
1 | |
方法三:滚动数组
1 | |
方法一:DP
注意初始化
1 | |
方法二:记忆化搜索
1 | |
2896. 执行操作使两个字符串相等

方法一:记忆化搜索
1 | |
2897. 对数组执行操作使平方和最大

方法一:位运算
1 | |
Memorization Search
https://leopol1d.github.io/2023/05/24/memorization-searcch/

