动态规划与分治法异同

本文探讨了动态规划与分治法在解决问题上的异同,指出动态规划适用于子问题重叠的情况,能避免重复计算。以斐波那契数列为例,展示了如何使用动态规划优化递归算法,通过存储中间结果提高效率。动态规划通过保存子问题的解,减少了计算量,是解决最优化问题的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相同:

动态规划通常用于求解最优解问题,与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

不同:

与分治法不同的是,适合用动态规划求解的问题,经分解得到的子问题往往不是相互独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题会被重复计算多次。而动态规划的做法是将已解决子问题的答案保存下来,在需要子问题答案的时候便可直接获得,而不需要重复计算,这样就可以避免大量的重复计算,提高效率。

 

下面通过一个例子来更好地理解:

斐波那契数列的递归求解如下:

int Fibonacci(int n)
{
    if(n==1||n==0)  //递归出口
       return n;
    else            //递归调用
       return Fibonacci(n-1)+Fibonacci(n-1); 
}

       事实上,这样进行分治会产生很多不必要的计算,如计算Fibonacci(7)时要计算Fibonacci(6)+Fibonacci(5),而计算Fibonacci(6)时要计算Fibonacci(5)+Fibonacci(4),我们可以发现Fibonacci(5)会被计算两次。其实,如果在计算完Fibonacci(5)后将其结果存储起来,求Fibonacci(6)时就不需要再求解一次Fibonacci(5)的值,如下图所示:

      为避免重复计算,可用一个数组dp来记录计算的中间结果,用dp[n]表示Fibonacci(n)。将dp[0]和dp[1]分别初始化为1后,按照递推公式dp[i]=dp[i-1]+dp[i-2]便可获得斐波那契数列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值