算法 | Five Steps to Dynamic Programming(解决动态规划问题的五个步骤)

动态规划(DP)是最常用的算法之一。它借助Divide and Conquer的思想,将一个问题分解为一个个渐进的subproblems(子问题),最终通过解决这些子问题来得到问题的终极答案。
和recursion(递归)的不同,DP会将所有子问题的答案存在一个表格里,以达到方便提取、提升效率的作用。因此,用递归需要指数时间解决的问题,很多都可以用DP在多项式时间内解决。一个最常见的例子就是计算第n项斐波那契数列

解决动态规划问题的五个步骤如下:

一、判断问题是否能用动态规划算法解决

一般来说,动态规划问题都可以写成如下形式:
max ⁡ f ( x 1 , x 2 , . . . x n ) s . t . L ( y 1 , y 2 , . . . , y n ) &lt; 0 \max f(x1,x2,...xn) s.t. L(y1,y2,...,yn)&lt;0 maxf(x1,x2,...xn)s.t.L(y1,y2,...,yn)<0
where L(y1,y2…yn) is the constraint function
即,在某些限制条件之下求出目标函数(objective function)的最大值或最小值
Max Array Sum问题来举例说明:输入一个数列arr,这道题的目标是在arr中选择若干两两不相邻的数,使它们的和最大。这道题就是典型的动态规划,限制条件是必须选择不相邻的数,目标函数则是它们的和。

二、写出子问题(subproblem)

将目标函数表示为OPT(n),那么子问题一般可以表示为OPT(k),其中k是input的大小。
继续以Max Array Sum问题为例。input长度为n的数列arr,我们最终想要算出的是:
O

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值