3级台阶问题 (记忆化搜索)
题目描述
楼梯有 n (70 >= n > 0) 阶台阶,上楼时可以一步上 1 阶, 也可以一步上 2 阶,也可以一步上 3 阶,编程计算共有多少种不同的走法。
输入描述:
第一行为 t 组数据
接下来t行,每一行一个整数,即为台阶数 n。
输出描述:
共 t 行,每一行为相应台阶数下走法的数目。
输入样例:
5
1
2
3
4
5
输出样例:
1
2
4
7
13
用递归
// 洛谷 P1192 简化就是这题答案
#include<bits/stdc++.h>
using namespace std;
int n,p[100005];
int dp(int x) {
int ans=0;
for(int i=1;i<=min(x,3);i++){
if(!p[x-i]){
ans+=p[x-i];
}else{
ans+=dp(x-i);
}
}
p[x]=ans;
return ans;
}
int main(){
int n;
cin>>n;
cout<<dp(n);
return 0;
}
简单递归,可以添加备忘录的方式或者转换成dp(动态规划)来优化时间复杂度。
#include<iostream>
int f(int n){
if(n == 1)
return 1;
if(n == 2)
return 2;
if(n == 3)
return 4;
else
return f(n - 1) + f(n - 2) + f(n - 3);
}
int main(){
int len;
std::cin>>len;
for(int i = 0;i < len;i++){
int n;
std::cin>>n;
std::cout<<f(n)<<std::endl;
}
return 0;
}