动态规划与分治法

本文探讨了动态规划和分治法这两种重要的算法思想。动态规划特点是将问题拆分为子问题并存储子问题的解,避免重复计算,常用于优化问题。分治法则是将大问题分解为相似的子问题求解,最终合并结果。动态规划和分治法的主要区别在于处理子问题的方式和是否使用递归。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态规划与分治法

1 动态规划

动态规划的特点
  • 把原始问题划分为一系列子问题
  • 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间
  • 自底向上地计算
动态规划的核心思想
  • 动态规划算法的核心就是记住已经解决过的子问题的解,后续问题不断查找之前的解得到答案
动态规划的使用范围
  • 一类优化问题:可分为多个相关子问题,子问题的解被重复使用
动态规划的设计步骤
  • 分析优化解的结构
  • 递归地定义最优解的代价
  • 自底向上地计算优化解的代价保存之,并获取构造最优解的信息
  • 根据构造最优解的信息 构造优化解 (核心关键) (即获取状态转换函数)
动态规划的常用案例

动态规划具体案例

  • 编号动态规划:输入为 x1, x2, …, xn,子问题是 x1,x2, …, xi 子问题复杂性为O(n)
    (最大不下降子序列问题)
  • 划分动态规划:输入为x1,x2,…,xn,子问题为xi,xi+1,…,xj,子问题复杂性是O(n2)(矩阵链乘问题)
  • 数轴动态规划:输入为x1,x2,…,xn和数字C,子问题为x1,x2,…,xi,K(K≤C)K(K≤C),子问题复杂性O(nC)(0-1背包问题)
  • 前缀动态规划:输入为x1,x2,…,xn和y1,y2,…,ym,子问题为x1,x2,…,x和y1,y2,…,yj,子问题复杂性是O(mn)(最长公共子序列问题)
  • 树形动态规划:输入是树,其子问题为子树,子问题复杂性是子树的个数。(树中独立集合问题)

2 分治法

分治法的特点
  • 分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问题合并起来,大问题就解决了
能使用分治法的特征
  • 问题缩小到一定规模容易解决
  • 分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质
  • 分解而成的小问题在解决之后要可以合并
  • 子问题是相互独立的,即子问题之间没有公共的子问题
分治法与动态规划的不同
  • 分治法会用到递归的方法,不断调用原函数得到答案。
  • 动态规划则不会,只是需要用到循环,通过状态转移函数得到答案。
    分治法两个例题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值