动态规划—入门级:斐波那契数列相关

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

关键点:找到题目给的关键的通项公式即可,多写几个步骤一般都能发现。还有要注意起始的初值即可。此类题目不难。

下面给出几个剑指offer上面的题目,仅供参考!

题1:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

#include <iostream>
using namespace std;
class Solution {
public:
	int Fibonacci(int n) {
		if (n <= 1) return 1;
		if (n == 2) return 2;
		long long fib1 = 1;
		long long fib2 = 2;
		long long Fib = 0;
		for (int i = 3; i <= n; i++){
			Fib = fib1 + fib2;
			fib1 = fib2;
			fib2 = Fib;
		}
		return Fib;
	}
};
int main(){
	int n;
	cin >> n;
	Solution s1;
	cout << s1.Fibonacci(n) << endl;;
}

题2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

#include <iostream>
using namespace std;
class Solution {
public:
	int jumpFloor(int number) {
		if (number == 1) return 1;
		if (number == 2) return 2;
		long long fib1 = 1;
		long long fib2 = 2;
		long long Fib = 0;
		for (int i = 3; i <= number; i++){
			Fib = fib1 + fib2;
			fib1 = fib2;
			fib2 = Fib;
		}
		return Fib;
	}
};
int main(){
	int n;
	cin >> n;
	Solution s1;
	cout << s1.jumpFloor(n) << endl;;
}
题3:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

#include <iostream>
using namespace std;
class Solution {
public:
	int jumpFloorII(int number) {
		if (number == 1)return 1;
		long long fib1 = 1;
		long long Fib = 0;
		for (int i = 2; i <= number; i++){
			Fib = fib1 * 2;
			fib1 = Fib;
		}
		return Fib;
	}
};
int main(){
	int n;
	cin >> n;
	Solution s1;
	cout << s1.jumpFloorII(n) << endl;;
}
题4:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

#include <iostream>
using namespace std;
class Solution {
public:
	int rectCover(int number) {
		if (number == 1)return 1;
		if (number == 2)return 2;
		long long fib1 = 1;
		long long fib2 = 2;
		long long Fib = 0;
		for (int i = 3; i <= number; i++){
			Fib = fib1 + fib2;
			fib1 = fib2;
			fib2 = Fib;
		}
		return Fib;
	}
};
int main(){
	int n;
	cin >> n;
	Solution s1;
	cout << s1.rectCover(n) << endl;;
}

参考文献:

[1]百度百科-斐波那契数列

[2]牛客网,剑指offer——编程题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值