思想
F(20)=F(19)+F(18)
/\ /\
F(18)+F(17) | F(17)+F(16)
从图中我们可以明显的看出F(18)和F(17)分别有两次重复,可以使用《算法导论》中的记忆化存储方式,进行判重,从而对算法进行优化。
它的主要思想其实和DP差不太多,都是给手下完成。
#include <bits/stdc++.h>//the n-th number
using namespace std;
long long f[100];
int fib(int n){
if (f[n]!=0)
return f[n];
if (n==0)
return 0;
else if (n==1)
return 1;
else{
f[n]=f[n-1]+f[n-2];
return f[n];
}
}
int main () {
int s;
cin>>s;
f[0]=0;
f[1]=1;
cout<<fib(s)
return 0;
}
仅供参考,请多指教