动态规划算法(一)

最近遇到动态规划算法的频率有点大,所以借此机会好好的来了解和学习一下动态规划。当然也记录下来,一起交流。

1. 了解概念

动态规划,英文名:Dynamic Programming ,简称DP,小名动规。

动态规划思想就是,大事化小,小事化了。它把大问题化解为小问题,再保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。

于是就可以了解其的特点,把大问题先分解成小问题,再解决小问题,把小问题的结果在递推成大问题的解。

适用场景:最大值/最小值, 可不可行, 是不是,方案个数

2. 基本步骤

从上面就可以得出其基本的步骤:

3. 实例入手

动态规划算法的概念在网上都可以查到,所以这里不详细说概念,而是以实际问题来说明。后面一系列,就开始从简单的问题到难的问题开始出发,一步一步了解和学习动态规划。

  • 跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解:根据上面的步骤开始入手,第一步则是状态定义,状态是从问题入手的,问题是“ n级的台阶总共有多少种跳法 ”,则设f(i):i级台阶的跳法。现在来分解问题,对于一只青蛙来说,由于它只能跳一级台阶和两级台阶,所以它到达第 i 层,就只能是在第 i - 1层和第 i - 2层的时候。

于是它到第 i 层的跳法,就是f(i) =  f(i-1) + f(i - 2)。于是第 n 阶就是 f(n) = f(n - 1) + f(n - 2)。现在找初始状态,f(1) = 1,f(2) = 2。因为f(2)的时候,可以一级一级的跳,也可以两级一起跳。于是通过 f(1)与f(2)就可以求f(3),直到f(n)。其实到这就可以想到这其实是一个斐波那契数列。

  • 变态青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解:同样根据上面的步骤开始入手,第一步则是状态定义,状态是从问题入手的,问题是“ 青蛙跳上一个n级的台阶总共有多少种跳法” ,设状态为f(i):青蛙跳上一个 i 级的台阶总共有多少种跳法。

i级台阶,同上一题一样,既然现在可以跳1、2、3、……、n级,
那么上i级就可以从
第一级跳一步上到第 i 级,此时一步跳了 i 级
也可以从第二级跳一步到 i 级,此时一步跳了 i - 1 级
同理也可以从第 i - 1级跳到 i 级,此时一步跳了 1 级

那么从定义的状态来看。青蛙跳上一个 i 级的台阶总共有多少种跳法。

就是跳上 1 级台阶、2 级台阶、3 级台阶、……、i 级台阶跳法的总和。

f(i) = f(i-1)+f(i-2)+...+f(i-i)
f(i) = f(i-1)+f(i-2)+...+f(0)

而

f(i-1) = f(i-2)+...+f(0)

于是

f(i) = 2*f(i-1)

于是对于 f(n)来说就是f(n) = 2 * f(n - 1)。而初始状态f(0) = 0,f(1) = 1。于是可以就可以推出f(i)了。

动态规划的代码其实比较简单,如果需要看源代码,请点击青蛙跳台阶源码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值