动态规划
1、思考状态(重点)
状态的定义,先尝试,题目问什么,就把什么设置为状态;
然后思考状态如何转移,如果状态转移方程不容易得到,尝试修改定义,目的依然是为了方便得到状态转移方程。
状态转移方程是原始问题的不同规模的子问题的联系。即大问题的最优解如何由小问题的最优解得到。
2、思考状态转移方程(核心、难点)
状态转移方程是非常重要的,是动态规划的核心,也是难点;
常见的推导技巧是:分类讨论。即:对状态空间进行分类;
归纳状态转移方程是一个很灵活的事情,通常是具体问题具体分析;
除了掌握经典的动态规划问题以外,还需要多做题;
如果是针对面试,请自行把握难度。掌握常见问题的动态规划解法,理解动态规划解决问题,是从一个小规模问题出发,逐步得到大问题的解,并记录中间过程;
动态规划方法依然是空间换时间思想的体现,常见的解决问题的过程很像在填表。
3、思考初始化
初始化是非常重要的,一步错,步步错。初始化状态一定要设置对,才可能得到正确的结果。
角度 1:直接从状态的语义出发;
角度 2:如果状态的语义不好思考,就考虑状态转移方程的边界需要什么样初始化的条件;
角度 3:从状态转移方程方程的下标看是否需要多设置一行、一列表示哨兵(sentinel),这样可以避免一些特殊情况的讨论。
4、思考输出
有些时候是最后一个状态,有些时候可能会综合之前所有计算过的状态。
5、思考优化空间(也可以叫做表格复用)
优化空间会使得代码难于理解,且使得状态丢失原来的语义,初学的时候可以不一步到位。先把代码写正确是更重要;
优化空间在有一种情况下是很有必要的,那就是状态空间非常庞大的时候(处理海量数据),此时空间不够用,就必须优化空间;
非常经典的优化空间的典型问题是0-1 背包问题和完全背包问题。
Leetcode No.5 最长回文子串_公众号:算法攻城狮-
Leetcode No.10 正则表达式匹配_公众号:算法攻城狮
Leetcode No.32 最长有效括号_公众号:算法攻城狮-
Leetcode No.42 接雨水_公众号:算法攻城狮-
Leetcode No.44 通配符匹配_公众号:算法攻城狮
Leetcode No.53 最大子序和_公众号:算法攻城狮
Leetcode No.54 螺旋矩阵_公众号:算法攻城狮-
Leetcode No.62 不同路径_公众号:算法攻城狮
Leetcode No.63 不同路径 II_公众号:算法攻城狮-
Leetcode No.64 最小路径和_公众号:算法攻城狮-
Leetcode No.70 爬楼梯_公众号:算法攻城狮-
Leetcode No.72 编辑距离_公众号:算法攻城狮
Leetcode No.73 矩阵置零_公众号:算法攻城狮
Leetcode No.75 颜色分类_公众号:算法攻城狮
Leetcode No.87 扰乱字符串(动态规划)_公众号:算法攻城狮-
Leetcode No.91 解码方法(动态规划)_公众号:算法攻城狮
Leetcode No.96 不同的二叉搜索树_公众号:算法攻城狮-
Leetcode No.97 交错字符串_公众号:算法攻城狮-
Leetcode No.115 不同的子序列_公众号:算法攻城狮
Leetcode No.118 杨辉三角_公众号:算法攻城狮
Leetcode No.119 杨辉三角 II_公众号:算法攻城狮-
Leetcode No.120 三角形最小路径和_公众号:算法攻城狮
限制最多两次交易
Leetcode No.122 买卖股票的最佳时机 II(贪心|动态规划)_公众号:算法攻城狮
Leetcode No.139 单词拆分(动态规划)_公众号:算法攻城狮-
Leetcode No.152 乘积最大子数组_公众号:算法攻城狮-
No.174 地下城游戏(动态规划)
限制最多k次交易
Leetcode No.188 买卖股票的最佳时机 IV(动态规划)_公众号:算法攻城狮-
Leetcode No.198 打家劫舍(动态规划)_公众号:算法攻城狮-
贪心
Leetcode No.45 跳跃游戏 II_公众号:算法攻城狮
Leetcode No.55 跳跃游戏_公众号:算法攻城狮
限制一次交易
Leetcode No.121 买卖股票的最佳时机(贪心)_公众号:算法攻城狮
允许多次交易
Leetcode No.122 买卖股票的最佳时机 II(贪心|动态规划)_公众号:算法攻城狮
Leetcode No.135 分发糖果(贪心)_公众号:算法攻城狮-