基础算法学习笔记(二)----动态规划

本文介绍动态规划的基本思想及其实现步骤,包括问题分解、寻找最优解及构造原问题解等。探讨了两种实现方法——自顶向下与自底向上,并通过实例讲解其在找零钱与0-1背包问题中的应用。

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

 

动态规划是一种用来找到问题最优化解决方案的策略,能用动态规划解决的问题一般需要具有“层叠子结构”。

基本思想

      动态规划的基本步骤如下:

    1. 将原问题分解为多个子问题。
    2. 找到子问题的解。(最优解)
    3. 用子问题的解构造原问题的解。

  由上可以看出,使用动态规划要求问题具有最优子结构,即初始问题的最优解可以通过子问题的最优解分步实现。

对于第三步有两种方法实现:

    1. 自顶向下(Top-down):采用递归形式实现。使用该方法需要采用额外变量来存储已经解决的子问题结果,来避免递归产生的重复计算问题。天然具有获得产生最优解步骤的能力。
    2. 自底向上(Bottom-up):采用迭代形式,将所有计算问题可能用到子问题的解都计算出来,然后用他们构造源问题的解。使用该方法需要用额外变量来存储产生最优解的步骤。天然具有消除重复计算的能力。

实现关键

能否用动态规划解决问题,关键一步就是能否构造出求解的子问题空间。对子问题空间的一般要求是:原问题是子问题将问题域进行扩大后的一个特例,子问题在迭代的第一步有自然解,解决大问题域的问题可以而且应该用到已解决的小问题域的解


难点主要有两方面:1.状态转移方程的建立,如何找到最优子结构,构造出状态转移方程(最大子序列和问题)

2.状态的确立,如何最优的确立状态,在满足无后效性的情况下最大可能的使子问题重叠率变大,已达到效率的优化。(青蛙荷叶问题)

实现策略

  1.将问题域的增大设计成由一个或几个变量线性增长实现的,即将问题域用几个线性增长的变量表示。

应用举例

找零钱,0-1背包问题都是动态规划的经典应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值