动态编程

动态编程是一种计算机编程技术,用于解决具有重复子问题的最佳子结构问题。以斐波那契数列为例,它通过存储子问题的结果避免重复计算,从而提高效率。与递归相比,动态编程在存在重复子问题时更有效,而贪婪算法则侧重于局部优化,不保证全局最优解。
摘要由CSDN通过智能技术生成

介绍

动态编程在计算机编程中是一种技术,能够有效解决拥有重复子问题的一类问题或者最佳子结构的问题。

例子

以斐波那契数列问题为例说明动态编程
如果序列是F(1) F(2) F(3)…F(50),遵循F(n) = F(n-1) + F(n-2)

F(50) = F(49) + F(48)
F(49) = F(48) + F(47)
F(48) = F(47) + F(46)
...

注意到拥有重复子问题,我们需要计算F(48)来计算F(50)和F(49)。动态编程可以解决的类似这样的问题。

工作原理

动态编程通过存储子问题的结果,以至当子问题的结果需要时,可以直接使用,而不需要重新计算。
存储子问题的值到数组中,节省重新计算的时间。

var m = map(0 → 0, 1 → 1)
function fib(n)
    if key n is not in map m 
           m[n] = fib(n − 1) + fib(n − 2)
    return m[n]

上面的动态编程是一种自上而下的动态编程。但是通过反转算法,从基数开始计算,使用自下而上的动态编程

function fib(n)
       if n = 0
           return 0
       else
           var prevFib = 0, currFib = 1
           repeat n − 1 times
               var newFib = prevFib + currFib
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值