引入:斐波拉契数列
1、递归
int fib(int n)
{
return n<2?n:fib(n-1)+fib(n-2);
}
2、记忆化
int a[50]={0};
int fib(int n)
{
if(n<2)
return n;
else
if(a[n]==0)
return a[n]=fib(n-1)+fib(n-2);
else
return a[n];
}
3、动态规划
int f=0,g=1,n;
while(0<n--){
g=g+f;
f=g-f;
}
eg.上台阶:每步可跨一个或两个台阶,到达第n阶的方案种数
动态规划:颠倒计算方向:由自顶向下递归,为自底向上迭代
formal:最长子序列
1、递归
int LCS(char a[],int n,char b[],int m)
{
if(n==0||m==0)
return 0;
else
{
if(a[n-1]==b[m-1])
return 1+LCS(a,n-1,b,m-1);
else
return max(LCS(a,n-1,b,m),LCS(a,n,b,m-1));
}
}
减而治之
分而治之
2、动态规划