动态规划与分治法异同

相同:

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

不同:

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

 

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

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

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)的值,如下图所示:

动态规划与分治法异同_第1张图片

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

你可能感兴趣的:(王道机试指南第二版)