【算法设计与分析】动态规划

一、动态规划的含义

首先,我们先来说一下什么是动态规划:动态的去把一个规则去对应用的数据进行一个合理的划分。
就是利用历史数据,避免重复计算来对空间,时间复杂度进行一个更好的优化。而这些历史数据,我们一般要用一些变量来进行保存,一般我们用数组dp[ ] 来保存,普通题目我们用一维数组或二维数组保存就可以了。

二、动态规划的步骤

(1)定义数组及其含义

就是需要搞清楚dp[i]表示的具体含义。 我们一般常用数组dp[] 去保存我们的历史数据。所以,我们需要明白这个数组的含义是什么,dp[0]… …dp[i]代表的具体意义是什么。相信大家都听过爬楼梯这个问题吧,在这个问题中,dp[0]代表的是爬到第1层楼梯时有多少种方法,dp[i]代表的含义就是爬到第i+1层楼梯有多少种方法。

在面对不同的问题时,dp[i]的含义也是不一样的。

(2)找出数组元素之间的关系式(递推方程)

就是找出如何通过历史数据来推出新的元素值,或者说他们之间有什么递进关系。 例如在爬楼梯的例子中,到达n阶楼梯的方法有两种,从n-1阶或n-2阶跳上来,所以在这个问题中递推方程就是:dp[n] = dp[n-1] + dp[n-2]。

在面对实际的问题时,如果能正确列出递推方程,其实问题基本就解决一半了,这可以说是最关键的一步,但也是最难的一步。

(3)给定初始条件和边界情况

我们先找出递推方程的适用范围, 还是爬楼梯,对于递推方程dp[n] = dp[n-1] + dp[n-2]来说,n是要从2开始的,一直计算到n去,即[2,n]。然后再为不在递推方程取值范围内的前置条件手动赋值。 就比如dp[0]和dp[1]不在[2,n]中,就需要我们提前为其赋值,这样当计算dp[2]时,dp[2] = dp[1] + dp[0]才能得出对应的值。

我们考虑在第1层时,只有一种方法到达,所以dp[0]=1;
在第2层时,只有两种方法(2或者1+1)到达,所以dp[1]=2。

这样通过递推方程算出来的dp[2] = dp[1] + dp[0] = 2 + 1 = 3。而实际中爬到第3层也是有3中方法(1+1+1,1+2,2+1)的,说明我们的初始化是正确的。

以上内容谨为个人学习过程的记录,欢迎大家一起学习和指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嘎嘎学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值