- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
POJ_DP
北京大学 陈峰宏;;最优子结构
最优决策序列的字序列也是最优的
无后效性
决策只取决于当前状态的特征因素,而和到达此状态的方式无关;递推同样需要状态的划分和无后效性
但是递推的转移函数(状态转移方程)通常不包括max和min,而是一些统计函数——如求和
递推的难点通常在状态建模和转移函数的确定
综上所述,将递推看成动态规划的一种形式是没问题的
因此,接下来的内容将不区别动态规划和递推;n个小朋友排队(每个小朋友都不一样高)。两个小朋友a和b能够互相看见当且仅当排在它们中间的小朋友比a和b都要矮。已知队伍中一共有m对小朋友可以互相看见,问有可能有多少种排队方式。
数据范围:n=80,m=10000;出题者想考察的是什么?
那么,有什么问题是不太需要考虑的?
由此可以发现什么?;从上面的分析可以看出,动态规划可以看成是对搜索的一种记忆化优化
动态规划就是将搜索时重复结算的状态保存下来,以空间换时间。
记忆化搜索往往是按自顶向下的方向求解,而我们平常所写的动态规划往往是自底向上的方向求解。
故实质上可以看成是记忆化搜索的一种非递归形式;有n个灯, 个开关,每个开关恰好控制3个灯(摁下去则改变那3个灯的状态),且任意两个开关控制的灯都不完全相同
给定n个灯的初始状态和目标状态
你需要打开恰好m个开关,达到目标状态
一开始所有的开关都是关着的
共有多少种方案(输出方案数模10007)?
数据范围(n=1000,m=1000);先来个原始的想法
F(I,j)表示打开i个开关,到达状态j(j不是一个数,而是表示一个状态,可能需要一个长度为n的二进制数)的方案数
问题
每个开关只能打开一次——无后效性???
时间和空间复杂度!!!!
;观察——对于初始状态和目标状态,输入中用个2n个数来描述
根据对称性,只需要知道两者有多少个灯有区别即可——需要一个数来描述
问题可以转化成,输入n,m,k(需要改变k个灯的状态),输出方案数
顺其自然,可以想到状态的表示,也可以如此简化
;F(I,j)表示打开i个开关后,改变了j个灯的状态的方案数
需要注意什么问题?
先开开关A,后开???关B,和先开B,后开A是不是同一种方案?
存在什么问题?
后效性仍然存在!!!无法解决重复打开同一开关的问题;记F(i,j)为打开i个开关(不重复),改变j个灯的方案数
F(i,j)=最后一个开关随意选的方案数——最后一个开关与前面某个重复的方案数
前者很好计算
后者@@,无从下手?;如何计算与前面某个状态重复的方案数?
已经打开了i-1个开关,有可能于任何一个重复
假设与第t个开关重复,去掉这两次操作(第t次和第i次),考虑接下来的i-2次操作
惊奇的发现,它与i次操作的结果相同
故与前面某个状态重复的方案数=f(i-2,j)*(i-1);综上所述,此题共有状态n*m个
状态转移所需时间复杂度O(1)
空间复杂度共为O(n*m)
时间复杂度为O(n*m)
还需要考虑的问题?
预处理
边界条件的判断
最后答案需要的处理
模10007剩余类的除法(10007是质数)
;可以先尝试简单的模型,再加以完善
学会把握住简化模型的关键点
有时可以通过观察数据范围,建立不同的模型
熟练的建立动态规划模型需要经验;动态规划的优化通常可以比较明显的分成两类
降低时间复杂度的优化——通常称为降维
不一定降低时间复杂度的优化——可以称为剪枝
并不是说降维一定比剪枝好,许多动态规划的剪枝空间还是很大的
但是剪枝通常没有固定的方法,需要的是大量经验。因此,这里着重讲动态规划的降维;使用队列、栈等线性数据结构降维
使用较高级的数据结构降维
四边形不等式
*凸(凹)完全单调性@@;给定m种砝码,每种砝码ai个,需要知道1克,2克……n克这些重量的物体能否秤出。
M=10000,n=10000,ai=10000。
;很常见的一类动态规划题
先不考虑时间复杂度,请给出一个动态规划建模方案。;考虑到时间复杂度,我们至少需要达到什么样的效果?
原方案中哪里有冗余?
发现了什么,如何优化?;地上并排插着n块木板,每块木板高度为ai,宽度为1。
请在这些木板上画出一个长方形用于广告,使得这个长方形的面积最大。
数据范围n=1000000;先考虑简单想法
将想法细致化,问题可以简化至什么程度?
结合数据结构,如何优化?;通常有一个浅显的建模(不一定哦O(∩_∩)O~)
转移方程有可优化的余地
接下来,需要观察
更进一步,有可能需要计算和推导
基本要求:需要对各种基础数据结构“融会贯通”(栈,队列……);国王想要游览整个城市。城市有一个n*m矩阵形状的交通路线。已知国王游览的“大方向”是从南向北(即绝不向南走),且不会经过重复的地方两次或以上。
每条东西向的街道都有一个权值(可以是负数),表示国民对国王的欢迎程度
文档评论(0)