当日总结

跳台阶问题
一个楼梯共有 n
级台阶,每次可以走一级或者两级,问从第 0
级台阶走到第 n
级台阶一共有多少种方案。

输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示方案数。
1.dfs暴力解法

include

using namespace std;
int dfs(int x)
{
if(x1)return 1;
if(x
2)return 2;
return dfs(x-1)+dfs(x-2);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int res=dfs(n);
cout<<res;
}
2.记忆化搜索优化

include

using namespace std;
const int N=20;
int mem[N];
int dfs(int x)
{
if(mem[x])return mem[x];
int sum=0;
if(x1)sum= 1;
else if(x
2)sum= 2;
else sum=dfs(x-1)+dfs(x-2);
mem[x]=sum;
return sum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int res=dfs(n);
cout<<res;
}
记忆化搜索使用了memory数组来存储已经计算过的值,避免重复递归。需要注意的是 else if(x2)sum= 2;如果写成 if(x2)sum= 2;在为1时,不会进入sum=2这个分支 会进入下面的else分支,就会出现sum等于dfs(0)+dfs(-1)的情况,造成数组越界。
3.递推dp

include

using namespace std;
const int N=20;
int F[N];

int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
F[1]=1;F[2]=2;
for(int i=3;i<=n;i++)
{
F[i]=F[i-1]+F[i-2];
}

cout<<F[n];

}
相当于dfs向下递归的式子
4.用三个变量取代数组,优化空间

include

using namespace std;
const int N=20;

int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
if(n1)cout<<1;
else if(n
2)cout<<2;
else{ int newf=0,tmp1=1,tmp2=2;
for(int i=3;i<=n;i++)
{
newf=tmp1+tmp2;
tmp1=tmp2;
tmp2=newf;
}

cout<<newf;

}
return 0;
},...,,..,

posted @ 2025-10-16 21:34  lagranSun  阅读(5)  评论(0)    收藏  举报