动态规划基础 清华大学 赵和旭 |
前言
◦ 1:我们先不对动态规划做一些枯燥的定义。
◦ 2:而是看两个简单的问题,看看如何分析和解决这样的问题,从这几道
题的分析过程共同点或者说特点中,归纳总结出动态规划的一般特点和
思路。
◦ 3:然后再通过几道例题来强化理解我们总结的动态规划做题思路。
◦ 4:之后我们将从另一角度理解动态规划,即记忆化搜索视角。
◦ 5:我们还将理解DP一种简单情况的转移路径, DAG上的DP。
◦ 6:再通过大家独立思考,实践两道题目,实现对dp算法的初步运用。
2019/7/17 Wednesday 清华大学——赵和旭 2
前言
◦ 7:一般形式的背包dp。
◦ 8:一般形式序列上的dp。
◦ 9:一般形式的区间dp。
2019/7/17 Wednesday 清华大学——赵和旭 3
填满网格
◦给出一个2*n的网格,你现在需要用n个 2*1的多米诺骨牌占满整个棋盘。
◦多米诺骨牌可以横着或者竖着放。
◦求有多少方案数占满整个棋盘。
◦ N<=10^6
2019/7/17 Wednesday 清华大学——赵和旭 4
填满网格
◦设f[n]为n列的答案
◦则根据如何对最后一两列放多米诺分情况讨论可得
◦ f[n]=f[n-1]+f[n-2]。
◦这是递推,也算是一个简单的dp,只不过绝大多数dp的转移方程不是根
据这题一样简简单单的一个加号就解决的。
2019/7/17 Wednesday 清华大学——赵和旭 5
网格图路径计数
◦给出一个n*m的网格,每次只能向右或者向下走,求从(1,1)走到(n,m)的方
案数,其中有些位置是不能走的。
◦ n,m<=1000
2019/7/17 Wednesday 清华大学——赵和旭 6
网格图路径计数
◦如果没有障碍物:设dp[i][j]表示从(1,1),走到(i,j)的方案数。
◦考虑上一步从哪里走过来可得, dp[i][j]=dp[i-1][j]+dp[i][j-1]。
◦答案就是dp[n][m]。
◦对于障碍:如果(i,j)是一个障碍,则定义dp[i][j]=0。
2019/7/17 Wednesday 清华大学——赵和旭 7
走金字塔的最大价值路径
◦ 给出一个高度为n的金字塔,你现在要从金字塔的顶端走到金字塔的底端。
◦ 金字塔的第i层,第j房间(记为(i,j) )有价值为a[i][j]的宝藏,每一步能从(i,j)能
走到, (i+1,j) , (i+1,j+1)。求从金字塔顶部走到底部能获得的最大的价值是多少?
◦ n=4的一个例子。
◦ 7
◦ 3 8
◦ 8 1 0
◦ 2 7 4 4
◦ ans=7+3+8+7=25
2019/7/17 Wednesday 清华大学——赵和旭 8
走金字塔的最大价值路径
◦和前面两题差不多。只不过前面是求方案数,运算法则为加法,而这里
求最优值,运算法则是取max。
◦设dp[i][j]表示从塔顶走到(i,j)能得到的最大的价值是多少。
◦则dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j]。
2019/7/17 Wednesday 清华大学——赵和旭 9
动态规划的基本思想? ——最优化。
◦利用最优化原理把多阶段过程转化为一系列单阶段问题,利用各阶段之
间的关系,逐个求解。
◦更具体的,假设我们可以计算出小问题的最优解,那么我们凭借此可以
推出大问题的最优解,进而我们又可以推出更大问题的最优解。(要满
足最优子结构)
◦(从小问题答案推到大问题的答案)
◦而最小的问题也就是边界情况我们可以直接计算出答案来。
2019/7/17 Wednesday 清华大学——赵和旭 10
动态规划的基本思想? ——最优化。
◦基本思想是将待求解的问题分解为若干个子问题(阶段),按顺序求解
子阶段,小的子问题的解,为更大子问题的求解提供了有用的信息。
◦由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,
对每一个子问题只解一次。
◦就像刚刚那几个递推式我们如果递归来做就会有很多冗余的计算。
2019/7/17 Wednesday 清华大学——赵和旭 11
动态规划的状态
•动态规划过程中,需要有状态表示和最优化值(方案值)
•状态表示是对当前子问题的解的局面集合的一种(充分的)描述。
•最优化值(方案值)则是对应的状态集合下的最优化信息(方案值),
我们最终能通过其直接或间接得到答案。
2019/7/17 Wednesday 清华大学——赵和旭 12
状态表示
◦对于状态的表示,要满足三条性质
◦ 1:具有最优化子结构:即问题的最优解能有效地从问题的子问题的最优
解构造而来
◦ 2:具有简洁性:尽可能的简化状态的表示,获得更优的时间复杂度。
◦ 3:同时能够全面的描述一个局面。一个局面有一个答案,而这个局面是
需要一些参数来描述的。
◦设计状态的关键就是 充分描述,尽量简洁。
2019/7/17 Wednesday 清华大学——赵和旭 13
动态规划的精髓? ——状态转移
•由于具有最优化子结构(在最优化问题种),所以求当前状态的最优值
可以通过其他的(较小的问题)状态的最优值加以变化而求出。所以,
当一个状态的所有子结构都已经被计算之后,我们就可以通过一个过程
计算出他的最优值。这个过程就是状态的转移。
•注意:状态的转移需要满足要考虑到所有可能性。
2019/7/17 Wednesday 清华大学——赵和旭 14
怎么计算动态规划的时间复杂度?
◦一般简单动态规划时间复杂度