【SeedCoder 2015年热身题2 动态规划 】费波拉契序列(题目+答案)

该博客介绍了一个关于动态规划的编程题目——求解费波拉契数列F(n)。通过输入整数n,计算F(n)=F(n-1)+F(n-2),并给出边界条件F(0)=1,F(1)=1。文章提供了示例输入和输出,并讨论了动态规划算法相对于普通搜索的效率优势。示例代码未在摘要中呈现。
摘要由CSDN通过智能技术生成

【问题】

对于输入一个整数n(n为大于或等于0的整数),求其费波拉契数列F(n)。其中F(n)=F(n-1)+F(n-2),F(0)=1,F(1)=1;

【输入】

输入由一系列的整数构成,每一个整数以Tab键隔开,每一个数表示一个n

【输出】

对于每一个n,输出对应的F(n),之间以Tab 键隔开。

【示例输入】(注意边界点的正确性)

0             6             15

【示例输出】

1             13           987


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【解答】

这道题目比较简单,但可以提供一个很好的例子比较普通搜索,记忆搜索和动态规划的算法效率。

一般而言记忆搜索和动态规划时间复杂度相当,而普通搜索效率较差。可以修改in.txt中的测试样例数据和改变变量method_temp变量进行比较。注意n值不能超过45,否则会超过int类型的最大值,产生溢出。可以修改int类型为long long 类型扩大n的取值范围。


【示例代码】

//--------------------------------------【程序说明】-------------------------------------------
//		程序说明:
//		程序描述:
//		IDE版本:Visual Studio 2013
//		作者:Arthur Lee
//------------------------------------------------------------------------------------------------  

//【1】头文件
#include <fstream>
#include <ctime>

using namespace std;

#define MAXNUMBER 10000
#define TIMER
//【2】函数声明
void InitialData();
int Search(int);
int MemorySearch(int);
int DynamicProgram(int);
//【3】定义枚举体,在几种方法中切换
enum Method
{
	NormalSearch,
	SearchWithMemory,
	DynamicProgramming
};


//【4】变量声明
int DP[MAXNUMBER+1];

int main(){
#ifdef TIMER
	clock_t start = clock();
#endif // TIMER
	ifstream fin("in.txt");
	if (fin.fail())
		return 1;
	ofstream fout("out.txt");
	int test;
	int result;
	while (!fin.eof())
	{
		InitialData();
		fin >> test;
		Method method_temp = Method::SearchWithMemory;
		switch (method_temp)
		{
		case NormalSearch:
			result = Search(test);
			break;
		case SearchWithMemory:
			result = MemorySearch(test);
			break;
		case DynamicProgramming:
			result = DynamicProgram(test);
			break;
		default:
			break;
		}
		fout << "the Fibonacci function of " << test << " is :" << result << "\n";
	}
	
#ifdef TIMER
	clock_t end = clock();
	double duration = (double)(end - start);
	fout << "runtime : " << duration << "ms" << endl;
#endif // TIMER
	fout.close();
	return 0;
}


//【5】函数实现
void InitialData(){
	for (int i = 0; i < MAXNUMBER + 1; ++i){
		DP[i] = 0;
	}
	DP[0] = 1;
	DP[1] = 1;
}

int Search(int n){
	int result_temp = 0;

	if (n == 1 || n == 0)
		return 1;

	result_temp = Search(n - 1) + Search(n - 2);
	return result_temp;
}

int MemorySearch(int n){

	if (DP[n]>0)
		return DP[n];

	if (n == 1 || n == 0)
		return 1;

	DP[n] = MemorySearch(n - 1) + MemorySearch(n - 2);
	return DP[n];
}

int DynamicProgram(int n){
	for (int i = 2; i <= n; ++i)
		DP[i] = DP[i - 1] + DP[i - 2];

	return DP[n];
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值