动态规划小结

讲一讲动态规划


  • 动态规划,一听起来就很高大上的样子,也因此很多人望而却步,不愿意理清楚他的逻辑,但是实际上这只是一种方法而已,并没有什么可怕的。
  • 首先说一下动态规划,总结起来就是一句话大事化小,小事化了,例如,给你一段10m长的绳子让你剪成几段,求最么剪能让每一段的长度之积最大,这很明显就是一个动态规划的问题,那我们来理一下,10m长的绳子你不知道,1m长的绳子你知道嘛,2米呢,3米呢,这些都能很轻松的得到,那么我们通过这很轻松得来的1、2、3,来计算接下来的4m,4m可以分为2+2、1+3,那1、2、3我们都已知了,岂不是很轻松得到了4m的结果,在接下来5m,可以分为1+4、2+3,这些我们又都知道,又能很轻易的得到5m的结果,以此类推下去,不就能很轻易的得到10m的结果嘛,这就是动态规划中的自底向上~是不是很简单?(可能有人会问为什么不能只留一段,这里我们可以加一个判断,取得到的结果和当前数的值较大的一个)
  • 再来说一说,自顶向下,10m,我们可以给它分为 n,10-n,当然n<10,就可以这么写f(10) = f(n) *f(10-n),那么我们再各自对f(n)和f(10-n)进行同样的操作,最后是不是一定可以分成基础的f(1),f(2),f(3)?这样不就是一个递归问题了吗,也能很容易的写出代码算出结果。
  • 上面一种情况,有一点要说明一下,递归的话,我们要考虑到他的时间复杂度,递归的时间复杂度一般都是指数性的上升,而我们怎么解决这个问题呢,我们具体到这个例子上,例如我10分成了4和6,而4分成2和2,6分成4,2,这时候我们是不是发现我们进行了很多次的重复计算?我们就可以把已经得到的结果存进一张哈希表里,然后计算前先判断一下hash表里有没有数据,没有再计算并存进去,这样就能把时间复杂度降到o(n).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值