191121题

题目:斐波那契数列
思路:
不能自上而下用递归,因为会重复计算一些子问题,如计算f(10)会用到f(9)和f(8),计算f(9)会用到f(8)和f(7),可见f(8)被重复计算了。
所以应该使用动态规划,动态规划会把子问题的解缓存起来,从而避免重复求解子问题。
故这里使用自下而上,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3)。相比于自上而下,每次只需要储存前两项的值就可以计算下一项,空间复杂度由O(n)降到了O(1),时间复杂度为O(n)。

#include<iostream>
using namespace std;
class Solution {
public:
	//从下往上
	//long long int是C99标准, 为64位, 8字节长度
	long long int Fibonacci(unsigned int n)
	{
		if (n == 0)
			return 0;
		if (n == 1)
			return 1;
		long long int fibNMinusOne = 1;//初始化
		long long int fibNMinusTwo = 0;//初始化
		long long int fibN = 0;//初始化
		for (unsigned int i = 2; i <= n; i++)
		{
			fibN = fibNMinusOne + fibNMinusTwo;
			fibNMinusTwo = fibNMinusOne;
			fibNMinusOne = fibN;
		}
		return fibN;
	}
};

另一道变式题:
题目:
我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2 * n的大矩形,总共有多少种方法?
思路:
2 * n的大矩形用2 * 1的小矩形去覆盖,左边有2种选择:
横着放左上角,左下角必须横着放,右边剩余2*(n-2)
竖着放左边,右边剩余2*(n-1)
所以根据上述分析,可得:
f(0)=0;
f(1)=1;
f(2)=2;
f(3)=1+f(2);
f(4)=f(2)+f(3);
f(n) = f(n-1) + f(n-2)
可见,也是个斐波那契数列。

class Solution {
public:
	//从下往上
	//long long int是C99标准, 为64位, 8字节长度
	long long int Fibonacci(unsigned int n)
	{
		if (n == 0)
			return 0;
		if (n == 1)
			return 1;
		if (n == 2)
			return 2;
		long long int fibNMinusOne = 2;//初始化
		long long int fibNMinusTwo = 1;//初始化
		long long int fibN = 0;//初始化
		for (unsigned int i = 3; i <= n; i++)
		{
			fibN = fibNMinusOne + fibNMinusTwo;
			fibNMinusTwo = fibNMinusOne;
			fibNMinusOne = fibN;
		}
		return fibN;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值