剣指offer面接問題9——階段を跳ぶ(非ロネ数列)
2779 ワード
タイトル1388:階段を跳ぶ
時間制限:1秒
メモリ制限:32メガ
特殊問題:いいえ
提出:3487
解決:1406
タイトルの説明:
1匹のカエルは一度に1段の階段を飛び上がることも、2段を飛び上がることもできます.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力は整数n(1<=n<=70)を含む.
出力:
各テストケースに対応し、
出力カエルがn段の階段を飛び上がるのに何種類の飛び方があるのか.
サンプル入力:
サンプル出力:
質疑応答:
問題を解くのに問題がありますか.解題の心得を分かち合いますか?このトピックについては、次のトピックを参照してください.
http://t.jobdu.com/thread-8111-1-1.html
この問題は最初は非ロネ数列とは思わなかったが,直接硬算すると,1ステップをx,2ステップをyとする.プロセス中、x+2 y=n、y値をとるとCx、n=n!x!*(n-x)!
でもきっとだめだよ.
次にフィロつま数列を採用しますが、構築時に最も簡単な再帰方法を採用しました.このようにデータが大きくなったら非常に遅く、時間の複雑さが大きすぎてだめだと気づきました.
低から高までフィロつま数列を計算すべきで、時間の複雑さを大幅に低減することができます
時間制限:1秒
メモリ制限:32メガ
特殊問題:いいえ
提出:3487
解決:1406
タイトルの説明:
1匹のカエルは一度に1段の階段を飛び上がることも、2段を飛び上がることもできます.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力は整数n(1<=n<=70)を含む.
出力:
各テストケースに対応し、
出力カエルがn段の階段を飛び上がるのに何種類の飛び方があるのか.
サンプル入力:
5
サンプル出力:
8
質疑応答:
問題を解くのに問題がありますか.解題の心得を分かち合いますか?このトピックについては、次のトピックを参照してください.
http://t.jobdu.com/thread-8111-1-1.html
この問題は最初は非ロネ数列とは思わなかったが,直接硬算すると,1ステップをx,2ステップをyとする.プロセス中、x+2 y=n、y値をとるとCx、n=n!x!*(n-x)!
でもきっとだめだよ.
#include<iostream>
using namespace std;
long long int Njiecheng(long long int n)
{
if(n==0)
return 1;
long long int a=1;
for(long long int i=0;i<n;i++)
a=a*(i+1);
return a;
}
long long int CN_N(long long int n,long long int x)
{
long long int last;
last=Njiecheng(n)/(Njiecheng(x)*Njiecheng(n-x));
return last;
}
long long int IntToInt(long long int a)
{
if(a==1)
return 1;
long long int x=0;
long long int y=0;
long long int last=0;
for(long long int i=0;i<=a/2;i++)
{
x=a-2*i;
y=i;
last=last+CN_N(x+y,x);
}
return last;
}
int main()
{
long long int n;
while(cin>>n)
cout<<IntToInt(n)<<endl;
return 0;
}
次にフィロつま数列を採用しますが、構築時に最も簡単な再帰方法を採用しました.このようにデータが大きくなったら非常に遅く、時間の複雑さが大きすぎてだめだと気づきました.
#include <iostream>
using namespace std;
typedef long long int LLint;
LLint fi(LLint n)
{
if(n==1)
return 1;
if(n==2)
return 2;
return fi(n-1)+fi(n-2);
}
int main()
{
long long int n;
while(cin>>n)
cout<<fi(n)<<endl;
return 0;
}
低から高までフィロつま数列を計算すべきで、時間の複雑さを大幅に低減することができます
#include <iostream>
using namespace std;
typedef long long int LLint;
int main()
{
int n;
while(cin>>n)
{
if(n==1||n==2)
{
cout<<n<<endl;
continue;
}
int i=2;
LLint last1=1;
LLint last2=2;
LLint last=0;
while(i<n)
{
last=last1+last2;
i++;
last1=last2;
last2=last;
}
cout<<last<<endl;
}
return 0;
}
/**************************************************************
Problem: 1388
User: 12138
Language: C++
Result: Accepted
Time:10 ms
Memory:1520 kb
****************************************************************/