动态规划是什么?如果不知道这个算法规则,我们一样可以解决问题相关,甚至天马行空的时候,更是状态无限,
但是,掌握很多的解法,却不知道这个问题怎么归类,是不是有更好的解决方式,或者一系列的算法题中是否可以提出规律呢?
这个宝贝的定义,我放在后边,看看随心所欲的编程带来的是什么样的结果。
斐波那契数列(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++<n){
System.out.print(j+",");
int k=j;
j=i+j;
i=k;
}
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<n;i++){
arr[i]=DynPFibonacci(arr,i);
}
for(int k=0;k<n;k++){
System.out.print(arr[k]+", ");
}System.out.print("...... ");
输出:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ......
即使这样,动态规划的强大之处还没有完全挖掘,所以需要继续完善,并不断的补充。