问题
题目:[N阶楼梯]
思路
本质应该是计数的方法。但是具体分析的时候,比较像DP。分析第N个状态,然后判断其与之前状态的关系。
显然,想要到达第N个状态,有两种办法。
- N-1阶时,走一步。
- N-2阶时,走两步。
完成一件事的N个步骤是乘法关系,多种方法是加法关系。设F[i]表示第i层楼梯的方法,所以有:
F[N]=F[N−1]∗1+F[N−2]∗1(1)
具体实现时,可先打表。做预处理优化。
代码
#include <iostream>
#include <fstream>
#include <cstring>
//#define LOCAL
#define N 90
typedef long long ll;
ll fib[ N ];
void preprocess();
int main( void )
{
#ifdef LOCAL
std::ifstream cin( "input.dat" );
#endif
int n = 0;
preprocess();
while( std::cin >> n )
{
std::cout << fib[n] << std::endl;
}
#ifdef LOCAL
cin.close();
#endif
return 0;
}
void preprocess()
{
std::memset( fib, 0, sizeof(fib) );
fib[0] = 1;
fib[1] = 1;
for( int i = 2; i < N; ++i )
{
fib[i] = fib[i-1] + fib[i-2];
}
}