动态规划问题

本文探讨了动态规划和递归在解决科技公司面试中的常见算法问题,如机器人走格子问题、计数问题、最值问题和存在性问题。动态规划常用于计算最优路径或解决方案的数量,如计算到达右下角的不同走法;而递归则用于生成所有可能的路径。通过定义状态、转移方程、初始条件和计算顺序,可以系统地解决动态规划问题。例如,使用动态规划求解硬币找零问题,寻找最少硬币组合。
摘要由CSDN通过智能技术生成

动态规划算法

科技公司面试必备算法

题目类型多,没有固定模板

难度属于中上

动态规划题目

请添加图片描述
机器人从左上角走到右下角,每次向右或者向下走一步
问题1:求有多少种走法? -> 动态规划
问题2:输出所有走法的路径? -> 递归
问题1一般用动态规划求解,而问题2一般用递归来解决。

如何判断该题为动态规划?

  • 计数题
    • 有多少种走到右下角的方法
    • 有多少种方法选出K个数使得和是sum
  • 求最大最小值
    • 从左下角走到右上角的最大数字和
    • 最长上升子序列长度
  • 求存在性
    • 取石子游戏,先手是否必胜
    • 能不能选出K个数使得和是sum

案例

你有三种硬币,分别面值2元,5元,7元,每种硬币都足够多
买一本书需要27元,如何用最少的硬币组合正好付清,不需要找钱?

步骤一:确定状态

状态在动态规划中作用属于定海神针,简单来说动态规划问题都需要一个数组,数组的每个元素,类似于数学题的未知数x,y,z
所以首先要确定状态,首先先确定一下最后一步的决策
该题中,最后一枚硬币一定是 ak,除去最后这个硬币,前面的硬币面值加起来是27-ak请添加图片描述
关键点1:我们不关心前面k-1枚硬币是如何拼凑出27-ak的,我们不知道ak和k是多少,但是我们确定前面的硬币拼出了27-ak
关键点2:因为是最优策略,所以拼出27-ak的硬币数一定要最少,否则这就不是最优策略

到这里我们就将问题变成了一个子问题,如何用最少的硬币拼出27-ak
为了简化定义,我们设状态f(x) = 最少用多少枚硬币拼出X

总结出来,如下图
请添加图片描述

步骤二:转移方程

设状态f[x]=最少用多少枚硬币拼出X
对于任意一个X
f[X] = min{f[X-2]+1,f[X-5]+1,f[X-7]+1}

步骤三:初始条件和边界情况

X-2.X-5.X-7小于0怎么办,什么时候停下来
如果不能拼出Y,就定义f[Y] = 正无穷
初始条件: f[0] = 0

步骤四:计算顺序

从左往右,因为要计算f[X]时,前边的f[X-2]什么什么的都已经计算过了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踢足球的程序员·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值