动态规划-斐波那契数列

2014-11-24 02:08:42 · 作者: · 浏览: 0

动态规划是什么?如果不知道这个算法规则,我们一样可以解决问题相关,甚至天马行空的时候,更是状态无限,

但是,掌握很多的解法,却不知道这个问题怎么归类,是不是有更好的解决方式,或者一系列的算法题中是否可以提出规律呢?

这个宝贝的定义,我放在后边,看看随心所欲的编程带来的是什么样的结果。

斐波那契数列(Fibonacci polynomial),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……

要求编程输出这样的一组数,比如输出10个数的序列。

源码

/**
	 * @param i 第n个数
	 * @param j 第n+1个数
	 * @param n 输出个数
	 */
	public static void DynPFibonacci(int i,int j,int n) {
		int ii=1;
		System.out.print(i+",");
		while(ii++
  

   

main函数中 DynPFibonacci(0,1,10);

输出:0,1,1,2,3,5,8,13,21,34,

这样的做法是完全的解决了问题,效率还行!如果没有看过动态规划算法规则,下一次相同类型的问题,有可能还是不能一下就搞定。

动态规划的规则如下:

是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

简单地说,问题能够分解成子问题来解决。

即使这么看书上说的,还是有些晕!用白话解释最好!

存在这样一数组,可以提炼出一个通项公式(高中数学),重复的用这个公式计算结果。

比如,斐波那契数列的通项公式为:F0=0,F1=1,F(n)=F(n-1)+F(n-2) ,(n>2) 或者 a(n)=a(n-1)+a(n-2),(a(0)=0,a(1)=2)

该公式就是最优子结构或子问题,重复的运用这个公式就可以计算出该序列。

源码:

	/**
	 * @param arr 存放序列的数组
	 * @param n 需要计算的第n的数
	 * @return 计算结果
	 */
	public static int DynPFibonacci(int[] arr,int n) {
			return arr[n-1]+arr[n-2];
		}

随便的调用下,生成结果

		int n=10;
		int[] arr=new int[n];
		arr[0]=0;
		arr[1]=1;
		for(int i=2;i
    

     


输出:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ......

即使这样,动态规划的强大之处还没有完全挖掘,所以需要继续完善,并不断的补充。