NOI2.3.3525 上台阶 题解(C++)

NOI2.3.3525 上台阶 题解(C++)

题目

3525:上台阶

总Time Limit: 1000ms Memory Limit: 65536kB

Description
楼梯有n阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。

Input
输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。

Output
每一行输出对应一行输入的结果,即为走法的数目。

Sample Input
1
2
3
4
0

Sample Output
1
2
4
7
注意,n的范围在1~99

思路

这一题的方法有两种,一种是用递归,还有一种是递推的方法,先说说递归吧。

递归解法思路

就是一个函数f(),f(n)可以等于f(n-1)+f(n-2)+f(n-3),这个没有问题吧,我们可以很轻易的写出一小段代码:

int f(int n){
	if(n == 1){
		return 1;
	}else if(n == 2){
		return 2;
	}else if(n == 3){
		return 4;
	}else{
		return f(n-1)+f(n-2)+f(n-3);
	}
}

把这个函数放进代码里应付小数据确实可以得到正确答案,但是如果输入的结果是99的时候就TLE(超时)了,所以我们要使用一种叫做记忆化搜索的东东,就是拿一个数组去存结果,就不会超时啦quq

递推解法思路

递推跟递归差不多,只不过递推可比递归简单了许多,只需要一个存结果的数组就OK啦。核心代码先上:

int res[100] = {0};
res[1] = 1,res[2] = 2,res[3] = 4;
...
for(int i = 4;i<n;i++){
	res[i] = res[i-1]+res[i-2]+res[i-3];
}

AC代码

差不多了,上代码:

#include
using namespace std;
int main(){
	int k[105] = {1},n = 0;
	long long ans[105] = {0};
	ans[1] = 1;
	ans[2] = 2;
	ans[3] = 4;
	while(1){
		int l;
		cin>>l;
		if(!l){
			break;
		}
		k[n] = l;
		n++;
	}
	for(int i = 0;i<n;i++){
		if(ans[k[i]]){
			cout<<ans[k[i]]<<endl;
			continue;
		}
		for(int j = 4;j<=k[i];j++){
			ans[j] = ans[j-1]+ans[j-2]+ans[j-3];
		}
		cout<<ans[k[i]]<<endl;
	}
}

你可能感兴趣的:(题解,信息学)