#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int dfs(int x)
{
//边界条件考虑
if(x==1) return 1;
if(x==2) return 1;
return dfs(x-1)+dfs(x-2);//拆分子问题
}
signed main()
{
cin>>n;
cout<<dfs(n);//递归
return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,f[1000005];
int dfs(int x)
{
//边界条件考虑
if(x==1) return 1;
if(x==2) return 1;
if(f[x]!=0)
return f[x];
return f[x]=dfs(x-1)+dfs(x-2);//拆分子问题
}
signed main()
{
cin>>n;
cout<<dfs(n);//递归
return 0;
}
dp
递推条件:
① 问题可以拆分成一系列的子问题。
②最小子问题可以直接得到答案。
③具有重叠子问题。
④具有无后效性
定义状态 dp[i]表示斐波那契数列第i项
确定答案 求dp[n]
求状态转移方程 dp[x]=dp[x-1]+dp[x-2]
边界条件 第一和第二项没法求
代码也码上
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,dp[1000005];
signed main()
{
cin>>n;
dp[1]=1;
dp[2]=1;
for(int i=3;i<=n;i++)
dp[i]=(dp[i-1]+dp[i-2])%1000;
cout<<dp[n]<<endl;
return 0;
}