动态规划入门一

dynamtic programming/动态规划
概念:一种分治的思想,将原问题不断地划分成子问题,自底向上解决并保存各个子问题的结果,当遇到同样问题时,查表得到结果,避免重复运算。

例如:Fibonacci sequence/斐波那契额数列问题:

输入:要找到的项数
输出:该项
递推式:
一.利用递归解决:
int Fib(int n)
{
if(n==1||n==2)
return 1;
return Fib(n-1)+Fib(n-2)
}

算法很简单,但是递归过程却做了很多“白费功”,分析一下过程:

假设输入6则有:

图中同样颜色的圈表示重复计算的部分(当然F(1),F(2)也有重复,不过它们直接返回几乎不消耗时间),浪费了很多时间,如果问题规模更大,则重复过程越多,效率越低,时间复杂度越高。
如果能把上图中重复部分的结果保存起来,则计算一次后,下次则直接查表,则可大大节约时间。
二.动态规划版/非递归版:
int Fib(int n)
{
int *fib=malloc((n+1)*sizeof(int));//为了使下标和斐波那契额数列的下标对应,让数组从1开始
int i;
fib[1]=1;
fib[2]=1;

for(i=3;i<=n;i++)
fib[i]=fib[i-1]+fib[i-2];
i=fib[n];
free(fib);//用i临时保存结果,及时释放空间
return i;
}
则此时的过程为:直接查表,不消耗时间。
头文件:

#include<stdio.h>
#include<stdlib.h>

主函数:

int main()
{
int n;
scanf("%d",&n);
printf("%d",Fib(n));
return 0;

}

请继续关注:动态规划入门二

猜你喜欢

转载自blog.csdn.net/SWEENEY_HE/article/details/79342792
今日推荐