动态规划--简单分析

本文通过将递归算法转换为动态规划算法,介绍了如何避免重复计算以提高效率。以斐波那契数列为例,展示了如何使用表记录已解决的子问题答案,从而将指数级的时间复杂度降低至线性。

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

将递归算法重新写成非递归算法,让后者把那些子问题的答案系统地记录在一个表里。利用这种方法的一种技巧被成为动态规划。

用一个表代替递归

计算斐波那契的自然递归程序是非常低效的:

public static int fib(int n){
    if(n <= 1)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}

                     

由上图跟踪递归计算,可以发现,在计算F6时,F3计算了3次,F2计算了5次,F1计算了8次。冗余计算的增长是爆炸性的。

 

如果能够预留一个预先算出的值的表而对已经解过的子问题不再进行递归调用,那么这种指数式的爆炸增长就可以避免。

由于计算FN所需要的只是F(N-1)和F(N-2)因此只需记录最近算出的两个斐波那契数列。

public static int fibonacci(int n){
		
	if(n<=1)
		return 1;
		
	int last = 1;
	int nextToLast = 1;
	int answer = 1;
		
	for(int i = 2;i <= n;i++){
		answer = last + nextToLast;
		nextToLast = last;
		last = answer;
	}

	return answer;
}

当然这只是一个简单的分析,后面要进行大量的练习来熟悉掌握动规。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值