递归代码模板
public void recur(int level, int param) {// terminatorif (level > MAX_LEVEL) {// process resultreturn;}// process current logicprocess(level, param);// drill downrecur( level: level + 1, newParam);// restore current status}
分治代码模板
def divide_conquer(problem, param1, param2, ...):# recursion terminatorif problem is None:print_resultreturn# prepare datadata = prepare_data(problem)subproblems = split_problem(problem, data)# conquer subproblemssubresult1 = self.divide_conquer(subproblems[0], p1, ...)subresult2 = self.divide_conquer(subproblems[1], p1, ...)subresult3 = self.divide_conquer(subproblems[2], p1, ...)…# process and generate the final resultresult = process_result(subresult1, subresult2, subresult3, …)# revert the current level states
动态规划定义(wiki)
动态递推
动态规划关键点
- 最优子结构 optin= best of(optn-1, optin-2],
- 储存中间状态:opt[]
递推公式(美其名日:状态转移方程或者DP方程)
Fib: optl[n]=opt[n-1]+opt[n-2]
二维路径: opt[i][j] = opt[i + 1][j]+opt[i]j + 1
参考链接
- :一维数组的简单递推。
- 不同路径题目:二维数组的递推。
- 不同路径 2 题目:二维数组的递推。
- 最长公共子序列题目:字符串的问题很多都会转换为二维数组。
-
实战题目
70. 爬楼梯:问1:如果每次可以爬1、2或者3步?问2:如果相邻两步的步伐不能相同?
- https://leetcode-cn.com/problems/triangle/description/
- https://leetcode.com/problems/triangle/discuss/38735/Python-easy-to-understand-solutions-(top-down-bottom-up))
- https://leetcode-cn.com/problems/maximum-subarray/
- https://leetcode-cn.com/problems/maximum-product-subarray/description/
- https://leetcode-cn.com/problems/coin-change/description/
