DP动态规划ACM课件.ppt_第1页
DP动态规划ACM课件.ppt_第2页
DP动态规划ACM课件.ppt_第3页
DP动态规划ACM课件.ppt_第4页
DP动态规划ACM课件.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

动态规划1 罗方炜 简介 DP是在20世纪50年代由一位卓越的美国数学家RichcardBellman发明的 它作为一种重要的工具在应用数学中被广泛的应用 它不仅可以解决特定类型的优化问题 还可以作为一种通用的算法设计技术来使用 DP的实质 利用问题的所具有的重叠子问题的性质进行记忆化求解 用空间换时间 求Fibonacci数 f n f n 1 f n 2 n 2f 1 f 2 1 常规递归 intNon DP intn if n 1 n 2 return1 elsereturnNon DP n 1 Non DP n 2 指数级时间复杂度 无法忍受 两种实现方式 自底向上 bottomup intDP Bottom Up intn memo 1 memo 2 1 for inti 3 i n i memo i memo i 1 memo i 2 returnmemo n 自顶向下 topdown intDP Top Down intn if n 1 n 2 return1 if memo n 0 returnmemo n memo n DP Top Down n 1 DP Top Down n 2 returnmemo n 基本概念 最短路问题 A B1 B2 C1 C2 C3 C4 D1 D2 D3 E 求A到E的最短路径 直观的方法是用回溯法搜索 时间复杂度为指数级 低效的原因 没有充分利用重叠子问题的性质 此图有明显的次序 可以划分为5阶段 A B1 B2 C1 C2 C3 C4 D1 D2 D3 E 阶段0 阶段1 阶段2 阶段3 阶段4 设Dis k x 为第k阶段城市x到城市E的最短路径长度 map i j 为i j两个城市间的距离 递归方程为Dis k x min Dis k 1 y map x y 此问题时间复杂度降为O n2 状态 贴切 简洁的描述出事物性质的单元量 例如 Dis x 要求 状态与状态之间可以转移 以便有初始状态逐渐转移到目标状态 找到问题的解 阶段 若干性质相近可以同时处理的状态的集合 就是计算状态的顺序 要求 每个阶段中状态的取值只与这个阶段之前的阶段中的状态有关 与这个阶段之后的阶段中的状态无关 状态转移方程 前一个阶段中的状态转移到后一个阶段的状态得演变规律 即相邻两个阶段的状态变化方程 fk i opt fk 1 j cost i j k阶段的i状态与k 1阶段的j状态有关决策 计算每个状态时作出的选择 适合用DP解决的问题的性质 最优子结构 若求解的问题是最优化问题 则原问题最优当且仅当自问题最优 Mod4最优路径问题找出1到4的一条长度mod4的余数最小的路径 1 2 3 4 此最优化问题不满足最优子结构 所以不适合用DP 但如果我们增加状态的维数 将最优化问题转化成判定性问题 再运用DP 问题就可得以解决 设f k i 为bool型数组 表示从1点到k点长度mod4为i的路径是否存在 f k i f k 1 i len k 1 f k 1 i len k 2 f k 1 i len k n 无后效性 决策之取决于当前状态的特征因素 而和到达此状态的方式无关 也就是每个阶段中状态的取值只与这个阶段之前的阶段中的状态有关 与这个阶段之后的阶段中的状态无关 如果当前定义的状态不满足无后效性 应重新定义 一维状态存储问题 硬币问题1 有n种硬币 每种硬币的面值为vi元 且只有一枚 问用这n种硬币找零S元的方法数 设d i j 为前i种硬币组成j元的方法数 d i j d i 1 j d i 1 j vi d 0 0 1 d 0 1 S 0空间复杂度为O n2 浪费 d 0 1 d 1 S 0 for i 1 i vi j d j d j vi 0 1背包问题 给定n种物品和一背包 物品i的重量是wi 其价值为vi 背包的容量为c 问应如何选择装入背包中的物品 使得装入背包中物品的总价值最大 设m i j 是背包容量为j 可选择物品为i i 1 n时 0 1背包问题的最优值 m i j max m i 1 j m i 1 j wi vi j wim i 1 j 0wn0i j wn d 0 c 0 for i 1 i wi j d j max d j d j wi vi 推荐题目 POJ1384Piggy Bank POJ1384参考代码 includeusingnamespacestd intd 10005 2 第2维用0表示标记 1表示钱的值intmain intx y weight intw m inti j t n scanf d 硬币问题2 有n种硬币 每种硬币的面值为vi元 有mi枚 问用这n种硬币找零S元的方法数 d 0 1 d 1 S 0 for i 1 i vi j for k 1 k 0 d j d j k vi 硬币问题3 有n种硬币 每种硬币的面值为vi元 有无数枚 问用这n种硬币找零S元的方法数 d 0 1 d 1 S 0 for i 1 i vi j for k 1 k if j k vi 0 d j d j k vi elsebreak d 0 1 d 1 S 0 for i 1 i n i for j vi j S j d j d j vi POJ2614OldWineIntoNewBottles有n种小瓶子 每种瓶子容量范围是Vi1 Vi2 要灌满容量为L的大瓶子 问最少差多少体积没有灌满 设d i 表示体积为i是否可以达到 若v可取到 则d i d i d i v d 0 1 d 1 L 0 for i 0 i n i for j 0 j L vi1 j if d j 1 for k vi1 k vi2 k d j k 1 POJ2614参考代码 includeusingnamespacestd intf 450001 0 v 102 2 boolfff 4600 intmain inti j k intl n intff 1 while scanf d d 最大子段和问题 给定由n个整数 可能为负整数 组成的序列a1 a2 an 求该序列形如的子段和的最大值 设bi为到ai截至且包括ai的字段最大和 intmaxsum intsum 0 b 0 for inti 0 i0 b a i 正的就连接起来elseb a i 不然重新来过if b sum sum b sum记录的一直是最大的值 returnsum 引申问题 最大子矩阵和问题最大m段子段和问题 最长递增子序列 LIS 常规DP 时间复杂度为O n2 存在一种特殊的方法 时间复杂度为O n logk 推荐题目 POJ1631BridgingSignals POJ1631参考代码 includeusingnamespacestd intd 40001 intmain intn t inti p num inthigh low x scanf d 二维状态存储问题 矩阵连乘问题 MCM A m n B n q cost m n qA1 10 x100 A2 100 x5 A3 5x50 A1 A2A3 100 x5x50 10 100 50 75000 A1A2 A3 10 x100 x5 10 x5x50 7500 最优子结构 重叠子问题 状态转移方程 阶段划分 推荐题目 POJ1141BracketsSequence POJ1141参考代码 include includeusingnamespacestd intn l stringstr intopt 101 101 stringds 101 101 charss 101 voiddynamic inti j k p for i 1 i l i opt i i 1 opt i i 1 0 ds i i 1 if str i str i ds i i elseds i i for p 1 p l 1 p for i 1 i l p i j i p opt i j 99999999 if str i POJ1141参考代码 for k i k j 1 k if opt i k opt k 1 j opt i j opt i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论