【问题】
对于输入一个整数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];
}
该博客介绍了一个关于动态规划的编程题目——求解费波拉契数列F(n)。通过输入整数n,计算F(n)=F(n-1)+F(n-2),并给出边界条件F(0)=1,F(1)=1。文章提供了示例输入和输出,并讨论了动态规划算法相对于普通搜索的效率优势。示例代码未在摘要中呈现。
1万+

被折叠的 条评论
为什么被折叠?



