动态规划是从前往后推,先考虑前面的最优解,然后直接使用前面的最优解用到后面,依次递推。
递归、备忘录都是从后往前推理。
递归需要重复调用,比如这个,8,7,6,都被计算两边。
备忘录是在递归算法的基础上,增加了数组或者一个动态链接,储存对应位置的数据,初始化后都为0,未有数据的计算后放到数组中,这样下次就可以直接直接使用了,就不用冲突计算数据。
走楼梯问题
一个楼梯共有10级台阶,一个人从下往上走,他可以一次走一个台阶,也可以一次走两个台阶。请问这个人有多少种走法走完这10级台阶?
递归算法
#include<stdio.h>
int Fibnacci(int i){
if(i==1) return 1;
else if(i==2) return 2;
else return Fibnacci(i-1)+Fibnacci(i-2);
}
int main(){
int n;
scanf("%d",&n);
printf("%d\n",Fibnacci(n));
}
备忘录
#include<stdio.h>
int fib[200]={0,1,1};
int Fibnacci(int n){
if(fib[n]==0){
fib[n]=Fibnacci(n-1)+Fibnacci(n-2);
}
return fib[n];
}
int main(){
int n;
scanf("%d",&n);
printf("%d\n",Fibnacci(n));
}
动态规划
#include<stdio.h>
int fib[2000];
int Fibonacci(int n){
fib[1]=1;
fib[2]=1;
for(int i=3;i<=n;i++){
fib[i]=fib[i-1]+fib[i-2];
}
return fib[n];
}
int main(){
int m;
scanf("%d",&m);
printf("%d\n",Fibonacci(m));
}