当日总结
跳台阶问题
一个楼梯共有 n
级台阶,每次可以走一级或者两级,问从第 0
级台阶走到第 n
级台阶一共有多少种方案。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示方案数。
1.dfs暴力解法
include
using namespace std;
int dfs(int x)
{
if(x1)return 1;
if(x2)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(x2)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(n2)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;
},...,,..,

浙公网安备 33010602011771号