赞
踩
动态规划算法与分治法类似,其基本思想也是将带求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
如我们求解斐波那契数列时:
- int Fibonacci(int n)
- {
- if(n<=0)
- return 0;
- if(n==1)
- return 1;
- return Fibonacci(n-1)+Fibonacci(n-2);
- }
思路:
如图,需要重复计算某些已经解决的答案。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。为了达到这个目的,可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填人表中。这就是动态规划法的基本思想。具体的动态规划算法是多种多样的,但它们具有相同的填表格式。
动态规划算法适合于解最优化问题,通常可以按照以下步骤:
(1)找出最优解的性质,并刻画其结构特征;
(2)递归的定义最优值;
(3)以自底向上的方式计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解
步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省去。若需要求问题的最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速构造出最优解。
下面运用动态规划算法来求解最长公共子序列问题,和矩阵连乘问题
问题描述:给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列,并且子序列指的是严格意义上的下标递增的序列。现给出两个序列X{ABCBDAB},Y{BDCABA},其最长公共子序列就是{BDAB}。下面给出求解最长公共子序列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。