2018暑假DP专题讲解-ChenCui.pptVIP

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2018暑假DP专题讲解-ChenCui.ppt

DP概述 举例说明 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大。 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 DP概述 暴力求解? 枚举起点终点,再扫描一遍。 时间复杂度O(n^3) 空间复杂度O(n) 显然这样很费时,很不优美 DP概述 暴力求解? 枚举起点终点,再扫描一遍。 时间复杂度O(n^3) 空间复杂度O(n) 显然这样很费时,很不优美 动态规划求解? 重叠子问题:区间求和每次都要从左到右扫一遍,然而求和时每个位置上的数被算了很多遍,因此可以 用前缀和维护代替扫描线。 最优化结构:当确定一个区间右端点时,区间左端点的最优解应为前缀和最小的那一个。而且前缀和最 小可以动态维护 后效性:每次确定右端点计算最优值是独立进行的 DP概述 步骤: 1、确定DP状态 * dp[i] 表示右端点在i号位置的最优解 * sum[i] 表示前i项的前缀和 * min[i] 表示前i项前缀和的最小值 2、确定状态转移方程 * dp[i] = sum[i] - min[i-1] 3、初始化并迭代转移 * 初始化sum数组,利用sum数组初始化min数组 *一遍循环计算dp数组 4、确定最终结果 dp数组中的最小值即为答案 02 线型DP 线型DP 定义:线性动态规划是指目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的 是求目标函数的最大值或最小值。 线型DP 定义:线性动态规划是指目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的 是求目标函数的最大值或最小值。 例1:最长上升序列问题(LIS) 问题描述: 设有序列B为B1,B2,B3……Bn,若存在下标i1i2i3……in,且Bi1Bi2Bi3……Bin,则序列B中 有长度为n的上升序列Bi1,Bi2,Bi3,……Bin。求给定一序列中的最长上升序列长度及该序列个数。 样例输入: 11 1 5 3 4 6 5 8 10 9 8 7 样例输出: 6 4 线型DP 分析: ①设f(i)是前i个数中以Bi结尾的最长上升序列的长度,则f(i)=max(f(j)+1), (1=ji=n,BjBi),边界为f(1)=1; ②设t(i) 是前i个数中所有最长上升序列的个数,初始t(i)=1,如果f(i)=n时,将t(i)累加。 ( 1=ji=n , BiBj , f(i)=f(j)+1 ) 时间复杂度O(n^2) 空间复杂度O(n) 贪心加二分??? 线型DP 例2:最长公共子序列问题(LCS) 对于集合S = {a[1]、a[2]、a[3]……a[n]},如果存在集合S = {a[i]、a[j]、a[k]……},对于下标i、j、k……满 足严格递增,那么称S是S的一个子序列。(不难看出线性dp中的问题是基于集合元素的有序性的)那么现在 给出两个序列A、B,它们最长的公共子序列的长度是多少呢? 样例输入: 5 6 5 4 6 2 1 4 5 2 6 3 1 样例输出: 3 线型DP 1、将整个问题给子问题化,设置二维数组dp[i][j]用于表示以A序列第i个元素为终点、以B序列第j个元素为终点 的两个序列最长公共子序列的长度。 2、建立状态转移方程 分段分析: 如果a[i] = b[j],显然这里我们基于dp[i-1][j-1]的最优情况,加1即可。即dp[i][j] = dp[i-1][j-1] + 1。 如果a[i] != b[j],dp[i][j] = max(dp[i-1][j] , dp[i][j-1])。 我们将两种情况综合起来。 for i 1 to len(a) for j 1 to len(b) if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1] + 1 else dp[i][j] = max(dp[i-1][j] , dp[i][j-1]) 3、时间复杂度O(n^2) 空间复杂度O(n) 线型

文档评论(0)

shiyouguizi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档