DP(我的比较菜,很垃圾)

 

动态规划基础
清华大学 赵和旭



前言
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的网格,你现在需要用n2*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
怎么计算动态规划的时间复杂度?
一般简单动态规划时间复杂度==状态数×状态转移复杂度。

转载于:https://www.cnblogs.com/liumengliang/p/11199798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值