动态规划--简单分析

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

用一个表代替递归

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

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

                    动态规划--简单分析_第1张图片 

由上图跟踪递归计算,可以发现,在计算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;
}

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

你可能感兴趣的:(dp,动态规划)