剣指OFFERの変態階段(九度OJ 1389)
3266 ワード
タイトルの説明:
1匹のカエルは一度に1段の階段を飛び上がることもできるし、2段も飛び上がることもできるし...n段も飛び上がることもできる.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力は整数n(1<=n<=50)を含む.
出力:
各テストケースに対応し、
出力カエルがn段の階段を飛び上がるのに何種類の飛び方があるのか.
サンプル入力:
6
サンプル出力:
32
問題解決の考え方:
この問題は以前のジャンプステップと大きく異なり,ジャンプステップのステップ数が1からnに変わっただけで,すなわち,ジャンプや2回ジャンプの問題ではなく,n回ジャンプの問題である.問題を解く構想は明らかに逆方向に分析しなければならない.
各最終階段は一歩飛び上がることができて、彼の前の階段から飛び上がることができて、彼の前の2つの階段から2つの階段を飛び上がることができます.では、まとめてみると、
最後に残った階段の数は、前の階段の飛び方を加えればよい.次のようになります.
最後にゼロの階段が残っていて、しばらく0にして、直接nの階段を飛び上がって、明らかに1つの方法しかありません.私たちは循環するたびにまず1を加えればいいです.
最後に1つの階段が残っていると、(n-1番目の階段の方法数)種類が共有される.
最後に2つの階段が残っており、(n-2番目の階段の方法数)種類がある.
....
最後にn-1階段が残っていて、1つの方法しかありません.
上記の方法を累積すると,n段目の階段にジャンプする数である.
コード:
#include <stdio.h>
long long int arr[51] = {0,1};
void createArr(void);
int main(void){
int n;
createArr();
while(scanf("%d",&n)!=EOF && n>=1 && n<=50){
printf("%lld
",arr[n]);
}
return 0;
}
void createArr(void){
int i,j;
for(i=2;i<51;i++){
j=i-1;
arr[i]++;//
while(j){
arr[i] += arr[j];
j--;
}
}
}