动态规划课后习题:
3.1
满足递归式F(n)=F(n-1)+F(n-2)和初始值F(0)=F(1)=1的数列称为斐波那契数列。考虑如何计算该数列的第n项F(n)。
(1)说明根据递归式直接完成计算,将有子问题重复求解;
(2)说明该问题具有优化子结构;
(3)写出求解F(n)的动态规划算法,并分析算法的时间复杂性。
- 答:
(1)计算F(n)需要计算F(n-1)和F(n-2),但是计算F(n-1)时仍需重复计算F(n-2),出现重复计算。
以此类推,对于F(n-i)(i≠n或n-1)时,此子问题将会被计算i次。
(2)在计算后面的值时,会反复用到前面的值。最终的结果是由前面问题的解组成的,故存在最优子结构。
(3)代码:
int fib(){
int n,result,son1,son2;
son1 = 1;
son2 = 1;
for(int i = 2;i <= n;i++){
result = son1+son2;
son1 = son2;
son2 = result;
}
return