【无标题】

如何解决动态规划类型问题

一.什么是动态规划

动态规划(Dynamic Programming),又称DP。动态规划的中文名称翻译过来比较高大上,实际上是运筹学的一个分支,早期50年代提出的一种求解决策过程最优化的过程。

我们可以看到早期动态规划是处理决策最优解的,于是这里引出2个问题:

  1. 什么问题可以使用动态规划解决
  2. 如何找到最优解

这里我个人认为可以从2个特征上快速入手

  1. 存在有限固定策略
  2. 大问题可以分解为重复的子结构

理解这个特征我们先引用一个经典按案例
案例:存在1、2、5、7不同面值的纸币,如何用最少的纸币组合支付97元的物品

分析:这里的问题是求解纸币组合的最优策略,符合动态规划的解题需求。假定我们可以用动态规划解决

1.这里存在什么样的策略
第一种:依次判断是否使用该纸币 得出一个伪代码
1
yes no
2
yes no
5
yes no
10
得出求解问题过程中的2个策略,“使用”“不使用”,符合有限策略。这里存在一个逻辑上的转换,不使用1就判断是否使用2,不使用2就判断是否使用5…
因此,我们简化为第二种策略

第二种:使用 1 or 2 or 5 or 10 面值的纸币,存在4中有限策略

很显然策略2符合逻辑,我们找到了有限策略,需要判断在循环求解过程中这组策略是否固定
分析:每次选择纸币的时候都是从1、2、5、10中选择一张,所以是固定策略

因此我们得到了有限固定策略:选择1、2、5、10

2.大问题分解为重复子结构
分析:动态规划是求最优解的过程,我们需要保证每一步都是最优解

97由什么组成?
97
1+? 2+? 5+? 10+?
这里我们使用有限固定策略分解了97的最优组成,得出4中情况,很显然每种情况中的“?”依然可以使用类似的方式递归分解为最优解
于是我们可以写出这么一个方程

dp(n) = min{dp(n-1)+1, dp(n-1)+2, dp(n-1)+5, dp(n-1)+10}
*这里的变量即我们的求解步数

我们把这个方程称之为“状态转移方程”,这也是求解动态规划问题的核心。
动态规划最大的问题在于如何找到“状态转移方程”,我个人的寻找方式便是分析问题寻找2个特征
1.存在有限固定策略
2.大问题可以分解为重复的子结构

当然在求解dp方程时,会遇到重复的子结构,我们建立一个额外的数组来存储每次递归的求解值,这样就可以避免重复计算相同结构问题
*当我们的子结构计算到不能分解时,我们还需要提前找到边界值(dp方程都写出来了,边界值不至于找不到)

二、动态规划练习

1.s长度的数组n,每位有f数量的金币,现在让你从这个数组中取最多的金币,条件(不可重复取同一位,相邻数组无法同时取到)
dp[i] = max{n[i] + dp[i - 2], dp[i-1]}

三、动态规划思考

A星是否是动态规划?
从动态规划角度分解
从贪心思想解决

A星的核心应该是启发式函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值