【学习笔记】动态规划与分治、贪心——概念区分辨析

一、动态规划——简介

动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想。
简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。

  • 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
  • 动态规划常常适用于有重叠子问题和最优子结构性质的问题。最优子结构保证了动态规划中原问题的最优解可以由子问题的最优解推导而来。
  • 一个问题必须拥有重叠子问题和最优子结构,才能使用动态规划去解决。
基本思想

若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

动态规划的核心:如何设计状态和状态转移方程
动态规划的三大基本要素

动态规划简单来说就是,利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。下面我们先来讲下做动态规划题很重要的三大基本要素[3]:

  1. 确定状态和保存状态变量
    将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。最简单的就是用数组来保存当前的每一个状态,这个状态就是每个子问题的决策。
  2. 确定决策并写出状态转移方程
    因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
  3. 确定边界条件
    确定边界条件其实就是跟递归的终止条件是类似的。给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
状态的无后效性:

当前状态记录了历史信息,一旦当前状态确定,就不会再改变,且未来的决策只能再已有的一个或若干个状态的基础上进行,历史信息只能通过已有的状态去影响未来的决策。例如,每次计算状态dp[i],都只会涉及dp[i-1],而不直接用到dp[i-1]蕴含的历史信息。

二、概念辨析

分治与动态规划

  • 共同点: 都是将问题分解为子问题,然后合并子问题的解得到原问题的解。

  • 不同点:

    • 分治法 分解出的子问题是不重叠的,因此分治法解决的问题不拥有重叠子问题;分治法解决的问题不一定是最优化问题;
    • 动态规划 解决的问题拥有重叠子问题;动态规划解决的问题一定是最优化问题。

贪心与动态规划

  • 共同点: 都要求原问题必须拥有最优子结构。
  • 不同点:
    • 贪心法 采用的计算方式是“自顶向下”,并不等待子问题求解完毕后再选择使用哪一个,而是通过一种策略直接选择一个子问题去求解,因此整个过程以一种单链的流水方式进行,显然这种所谓的“最优选择”的正确性需要用归纳法证明(不一定能得到最优解)。
    • 动态规划 不论是采用自底向上or自顶向下的计算方式,都是从边界开始向上得到目标问题的解。即,它总是会考虑所有子问题,并选择继承能得到最优结果的那个,对暂时没被继承的子问题,由于重叠子问题的存在,后期可能会再次考虑他们,因此还有机会成为全局最优的一部分,不需要放弃。
  • 综上,
    • 贪心 是一种壮士断腕的决策,只要进行了选择,就不后悔;
    • 动态规划 则是要看哪个选择笑到了最后,暂时的领先说明不了什么。

二分法与分治法

二分法: 每次都要舍弃一半,从留下的一半中寻找目标;
分治法: 把一个大问题分成两个或多个小问题,递归地求这些小问题的解,最后再把它们合并起来,并且要仔细考虑合并时产生的新的情况。

参考文献
https://blog.csdn.net/weixin_43777983/article/details/89413447
https://www.cnblogs.com/raichen/p/5772056.html
https://blog.csdn.net/qq_38670588/article/details/108186884
算法笔记,胡凡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值