动态规划算法

来源:互联网 发布:photoshop 2015 mac 编辑:程序博客网 时间:2024/06/05 06:13
(一)动态规划算法原理
                将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来。
                 了不去求解相同的子问题,引入一个数组,把所有子问题的解存于该数组中,这就是动态规划所采用的基本方法。动态规划采用由下至上(Bottom-Up) 计算策略。  


 例1:Fibonacii数列的第n项
1、普通递归
#include <stdio.h>
int fib(int n)
{ if  (n<=1)  return 1;
      else   return fib(n-1)+fib(n-2);   
}
int main( )
{ int n;
scanf("%d",&n); printf("%d\n" ,fib( n ) );
}
      在上面的递归算法中存在多次计算同一个子问题,如:fib(2),因此当n较大时速度很慢。
      如果能将这样的子问题的解用数组保存起来,就可以加快求解的过程,即采用动态规划方法。或者在递归计算之前判断前面是否计算过,即采用记忆式搜索方法。




2、记忆式搜索
#include <stdio.h>
#define MAX 50+1
int a[MAX];
int fib(int n)
{ if (a[n]==-1)
          return a[n]=fib(n-1)+fib(n-2);
else  return  a[n];  
}
int main( )
{ int i,n;
for(i=1; i<MAX; i++)    a[i]=-1;
         a[0]=a[1]=1;
scanf("%d",&n);   printf("%d\n" ,fib( n ) );
}


3、动态规划
#include <stdio.h>
#define MAX 50+1
int fib(int n)
{ int i,a[MAX];
a[1]=a[2]=1;
    for (i=3; i<=n; i++)
a[i]=a[i-1]+a[i-2];
return a[n];
}
void main( )
{ int n;     scanf("%d",&n);
printf("%d\n" ,fib( n ) );
}
0 0
原创粉丝点击