(dp)动态规划

动态规划是一种有效解决问题的方法,尤其适用于有重叠子问题的情况。文章通过青蛙跳台阶的问题,介绍了动态规划的五部曲:明确dp数组含义、求递推公式、初始化、遍历顺序和检查。此外,还讨论了如何将其应用到寻找最小花费路径的问题中。

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

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。

例如我们所知的斐波那契数列,第五项由第四项和第三项得出,第四项又由第三项和第二项求出,以此类推。每个点的状态都由之前的一个或多个点的状态推导出来。

代码随想录作者中,总结了动态规划五部曲:

  1. 搞清楚dp数组的含义

  1. 求得递推公式

  1. 对数组中某些点初始化

  1. 确定遍历顺序

  1. 打印dp数组(同时也有利于检查)

我们在学习递归时一定会接触到汉诺塔和青蛙跳台阶的例子,这里我们用青蛙跳台阶的例子就很经典。

题目:假设青蛙一次可以跳1或2节台阶,那么跳到指定的一层又多少种方法?

看到题目可能会这样想:先跳1节然后2节...不断地尝试,最后自己都弄混了,那么我们可以根据题目来思考一下。

题目要求得的是跳到某节台阶的方法数,那跳到这里必然从n-1节或者n-2节台阶跳上来,因为一次只能跳1或2节,那么再进一步猜测,n-1节台阶也是从n-2节台阶或者n-3节台阶跳上来的,这符合我们动态规划的状态推导。所以我们猜测用动态规划解决。

第一步.dp[i]是跳到第i节台阶的步数

第二步.dp[i]=dp[i-1]+dp[i-2];

第三步.i=1时越界了,i=2时,没有dp[0]无意义,所以我们初始化dp[1],dp[2]即可

第四步.后面的都是由前面推导出来的,所以我们从前往后遍历

...

代码实现:

这个只是动态规划最基本的案例,在实际解题过程中我们要尽量弄懂题目的意思,根据以上几个步骤逐步去完成。

例如例题2,只能向右或向下走,走一步会消耗当前点位的所给的数值,求走到m,n点的最小花费

根据题目,我们求dp[m][n]只用求从上面一步的最小花费+cost和左边一步最小花费+cost,二者中的最小值。

作者:鲸住我了王晨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值