斐波那契数列
斐波那契数列是非常经典的数列。它指形如1,1,2,3,5,8,13,21,34,55这种数列。这种数列的特点是从第三数(包括第三个数)开始,之后的每一个数大小都是它前两个数的和。斐波那契问题算是动态规划的入门级题目。
斐波那契数列
题目大意:数列1,1,2,3,5,8,13是一个斐波那契数列,问这个数列中第n(n<=30)个数是什么.
解题思路:斐波那契数列中第i个数的大小为f[i]=f[i-1]+f[i-2],其中i>=3,所有只需要先写出第一个和第二个数的值,再按照这个式子将后面的数字一个个算出来就可以了,无论是循环还是递归都可以。
不过斐波那契数列的增长速度非常快,当n很大的时候需要用到高精度加法来计算第n个数。
参考代码:
#include<iostream>
using namespace std;
int main()
{
long long int n,a[35]={1,1};
cin>>n;
for(int i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
return 0;
}
爬楼梯
题目大意:一个楼梯共有n阶(n<=30),每一次上楼梯只能上一阶或两阶,问一共有多少种上去的方法
解题思路:我们设f[i]为登上第i阶的所有方法,一开始我们处于地面,属于第0阶,而第0阶不需要走,所以f[0]=1,而登上第一层台阶只有一种方法,就是从第0阶往上走一阶。其中f[i]是由f[i-1]登上一阶或者f[i-2]登上两阶得到的,我们可以得到关于f[i]的公式:f[i]=f[i-1]+f[i-2],登上第i阶的方法是i-1阶与i-2阶的方法之和。所以这也是一种斐波那契数列。 代码其实和上方是一样的。
代码:
#include<iostream>
using namespace std;
int main()
{
long long int n,a[35]={1,1};
cin>>n;
for(int i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
return 0;
}