其实dp思想就是,暂时给你存着,别重复计算
相比冗杂不存储每次都重来的头铁递归,dp省时不少
#include<iostream>
using namespace std;
int fib1(int n,int arr[]) //自顶向下——备忘录 有返回值
{
if(n==0)
{
arr[n]=0;
return 0;
}
else if(n==1||n==2)
{
arr[n]=1;
return 1;
}
else if(n>=3)
{
if (arr[n]==-1)
{
arr[n]=fib1(n-1,arr)+fib1(n-2,arr); //好不容易算出来先保存
return fib1(n-1,arr)+fib1(n-2,arr); //然后把这个值传给有用的那个它,因为int 所以不如写成void
}
}
}
void fib2(int n,int arr[]) //自顶向下——备忘录 不用返回值写法
{
if(n==0)
arr[n]=0;
else if(n==1||n==2)
arr[n]=1;
else if(n>=3)
{
if(arr[n]==-1)
{
fib2(n-1,arr),fib2(n-2,arr);
arr[n]=arr[n-1]+arr[n-2];
}
}
}
void fib3(int n,int arr[]) //越用递归越费时间内存
{
for(int i=0; i<=n; ++i)
{
if(i==0)
arr[i]=0;
else if(i==1||i==2)
arr[i]=1;
else
arr[i]=arr[i-1]+arr[i-2];
}
}
int main() {
int n,arr[1000];
cin>>n;
for(int i=0; i<=n; i++)
arr[i]=-1;
fib3(n,arr);
cout<<arr[n];
return 0;
}