动态规划

部署运行你感兴趣的模型镜像

本文系作者原创,转载请注明出处:https://blog.youkuaiyun.com/coder_what/article/details/83626100


在笔者看来,动态的规划是由递归/递推+储存组成。

一个问题,通过不断的递归/递推,遍历各种可能的结果,到达边界后从而找到最终解。

然而,如果仅仅是递归/递推的话,就很有可能出现超时的情况,这是就用到了动态规划的亮点和核心:用空间换时间

如何用空间换时间?

试想,对于一个需要多次计算的式子来说,如果我们在第一次计算的时候就直接记录下它的值,那么在之后的计算中直接调

用它的结果就行了,不必再次计算从而浪费时间。

但是要注意的是,建立储存空间后,一定要给其全赋值为0//或者其他同等意义的数,不然不能判断这个空间是否存入数据!

其实我们知道,在用递归的时候,通过不断调用函数,也有可能造成栈溢出或者超时。那么,这时候就需要我们通过一个二维数组通过递推或者栈的方式来规避这种错误。

假设递归我们已经知道,就是重复调用一个函数,使问题变成一个又一个简单但结构相同的子问题

那么是么是递推呢?

递推即使通过多重循环(一般是二重),来储存每一个简单问题状态所产生的结果。*需要注意的是,一般情况下,递归的思路比递推的简单,但是相对了言,递推的效果却要好很多。

无论是递归还是递推,他们都需要一个规律来进行“传递”,这就是我们所说的  状态转移方程

笔者看来,动态规划是贪心算法的进阶版,动态规划适用于最优子结构问题(即子问题也是最优的)

关于动态规划,更详细的解释请参考这位dalao博主:http://blog.youkuaiyun.com/baidu_28312631/article/details/47418773

动态规划还有一个重要问题就是对空间进行优化。事实上,在大多数AC代码中,都存在通过把数组压缩来获得空间优化的可能性。这样我们就引入了滚动数组https://blog.youkuaiyun.com/qq_30796379/article/details/79118407)这个概念

滚动数组的作用在于优化空间,当我们解决问题时,常常需要用到连续的解,但是往往前面的解只用到了一次,即前面的解在用完之后可以舍去,这样就达到了空间的重复利用。

我在别的博客中写了几道关于动态规划的问题(Peking University POJ 1163和1548)和详解。

传送门:

1163:https://blog.youkuaiyun.com/coder_what/article/details/83832160

1548:https://blog.youkuaiyun.com/coder_what/article/details/83857812

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值