题目描述
Zexal打算借助河中间的石砖过到河对岸去。Zexal从第一块石砖出发,接下来他可以走到第二块石砖或第三块石砖,有时候走的很不爽,甚至可以直接跨过两个石砖,到达第四块石砖,但是不能连续两次这种操作,因为这样消耗体能比较大。现在假设河中含nn块石砖,且这些石砖呈直线分布,请你计算出Zexal从第一块石砖出发有多少种安全的过河方法。
输入
输入将由多组测试数据组成,以EOF结尾。
每组数据只有一行,为河中的总石砖数n(0<n≤50)。
输出
对于每组数据,输出一行,为过河的方法数。
输入样例
1 2 3
输出样例
1 2 4
样例解释
1:一步走完;
2:先走到2再走完,或者直接走完;
3:111或12或21或3。
容易想出来的代码
#include <iostream> #include <stdio.h> using namespace std; long long n,a[51][2]; int main() { a[1][0] = 1; a[2][0] = 2; a[3][0] = 3; a[1][1] = 0; a[2][1] = 0; a[3][1] = 1; for(int i = 4; i <= 50; i++) { a[i][0] = a[i-1][0] + a[i-2][0] + a[i-1][1] + a[i-2][1]; a[i][1] = a[i-3][0]; } while(~scanf("%d",&n)) { printf("%lld ",a[n][0] + a[n][1]); } return 0; }
不那么容易想的代码
#include <iostream> #include <stdio.h> using namespace std; long long n,a[51]; int main() { a[1]= 1; a[2]= 2; a[3]= 4; a[4] = 7; a[5] = 13; for(int i = 6; i <= 50; i++) { a[i] = a[i-1] + a[i-2] + a[i-4] + a[i-5]; } while(~scanf("%d",&n)) { printf("%lld ",a[n]); } return 0; }