动态规划入门和典型模型.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
01背包 在n件物品取出若干件放在空间为V的背包里,每件物品的体积为w1,w2……wn,与之相对应的价值为p1,p2……pn。 01背包 定义状态dp[i][j]: 考虑前i件物品,选的物品总体积=j的情况下价值和的最大值 转移方程: O(n*V) dp[i][j]=max(dp[i-1][j], dp[i-1][j-wi]+pi) 初始条件:dp[0][0]=0, dp[0][j0]=-INF 答案:max(dp[n][j=V]) 01背包 定义状态f[i][j]: 考虑前i件物品,选的物品总体积=j的情况下价值和的最大值 转移方程:O(n*V) f[i][j]=max(f[i-1][j],f[i-1][j-wi]+pi) 初始条件:f[0][j=V]=0 答案:f[n][V] 完全背包 有n种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是w,价值是p。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。 完全背包 定义状态dp[i][j]: 考虑前i件物品,选的物品总体积=j的情况下价值和的最大值 转移方程: O(n*V*V/W) dp[i][j]=max(dp[i-1][j-wi*k]+pi*k)(k=0) 初始条件:dp[0][0]=0, dp[0][j0]=-INF 答案:max(dp[n][j=V]) 多重背包 有n种物品和一个容量为V的背包,每种物品都有一个数量限制l。第i种物品的体积是w,价值是p。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。 背包问题 分组背包 二维背包 树上的背包 注:完全背包和多重背包都是可以优化到O(n*V)的,参考《背包问题九讲》 推荐尝试:/#/problem/show/424 LIS 一个数列S如果分别是已知数列的单调上升子序列,且是所有符合此条件序列中最长的,则S称为已知序列的最长上升子序列。求S。 LIS 定义状态dp[i]: 表示以S[i]结尾的最长上升子序列的长度 转移方程:O(n*n) dp[i] = max(dp[j]+1) (ji a[j]a[i]) LIS 定义状态dp[S[i]]: 表示以S[i]结尾的最长上升子序列的长度 转移方程: dp[S[i]]=max(dp[v]+1)(va[i]) 复杂度?O(n*n) 用线段树或者树状数组优化?O(n*logn) /#/problem/show/877 还有其他方法吗?有!! LCS 一个数列S如果分别是两个已知数列A,B的子序列,且是所有符合此条件序列中最长的,则S称为已知序列的最长公共子序列。求S。 LCS 定义状态dp[i][j]: 表示考虑A的前i位和B的前j位,最长公共子序列的长度 转移方程:O(|A|*|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]); 合并石子 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 区间DP 合并石子 n 堆石子摆成一列。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最大得分。 区间DP dp[l][r]表示从把l到r的石子合并为一堆时的最大得分 转移方程:dp[l][r]=dp[l][k]+dp[k+1][r]+sum[l][r](l=k=r) for(int l=1;l=n;l++) { for(int r=l+1;r=n;r++) { for(int k=l;k=r;k++) { dp[l][r]=max(dp[l][r], dp[l][k]+dp[k+1][r]+sum[l][r]); } } } 区间DP 转移方程:dp[l][r]=dp[l][k]+dp[k+1][r]+sum[l][r](l=k=r) for(int r=2;r=n;r++) { for(int l=r-1;l=1;l--) { for(int k=l;k=r;k++) { dp[l][r]=max(dp[l][r], dp[l][k]+dp[k+1

文档评论(0)

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

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

1亿VIP精品文档

相关文档