动态规划 dynamic programming

动态规划,不用多说了,程序员进阶必然遇到的障碍。

算法简述

稍微了解过动态规划的都知道动态规划有四个要素:状态,状态转移方程,初始化,后处理。 但事实上很多时候难点在于根本就找不到这些东西。 因此,笔者力求从另一个角度,直接把dp分类,找到一类题的共性。

算法分类

无后效性问题
1.秤砣类问题

这类问题往往有几个“秤砣”供选择,然后求拼重量的方案。
这类题常常dp[i]表示数量为i时有的方案数。常见更新方式:dp[i]+=dp[i-x]

力扣518 零钱兑换II https://leetcode-cn.com/problems/coin-change-2/

与指针结合
力扣264 丑数II https://leetcode-cn.com/problems/coin-change-2/
力扣313 超级丑数 https://leetcode-cn.com/problems/super-ugly-number/

2.子序列类问题 比如经典的LIS问题。 这类题常常dp[i]表示长度为i时最小的最后一个数。 常见更新方式:dp[i]=nums[j] dp[i][j]表示数组i到数组j之间蕴含的最值子序列。

力扣300 最长递增子序列(LIS问题) https://leetcode-cn.com/problems/longest-increasing-subsequence/

3.操作类问题
这类题常常dp[i][j]表示数组下标i到数组下标j需要经历的变化数或其他含义

力扣516 最长回文子序列 https://leetcode-cn.com/problems/longest-palindromic-subsequence/
力扣375 猜数字大小II https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/

4.路径数量
这类题常常dp[i][j][k]表示走i步时(j,k)处的路径数。
5.价值问题
这类题常常dp[i][j]表示状态i选择第j个物品时的最大价值 这类题有点像状态机,需要思考状态之间是如何转移的。(可以看本人另一篇博客——股票 https://www.cnblogs.com/S-N-O-R-L-A-X/p/15158548.html )

力扣309 最佳买卖股票时机含冷冻期 https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

常见疑惑的说明:

无