(DP)斐波那契数列的动态规划求解(Fibonacci Dynamic Programming)
2018-03-08 17:38
417 查看
对于斐波那契数列的求解,已经有成型的递归公式,因此最简单的求解方式就是利用递归求解,但是对于庞大的数据量,显然递归的时间耗费是巨大的。
因为每次计算一个F
都会计算F[n-1]和F[n-2],而F[n-1]和F[n-2]的下一个子问题有很多的相同项,这无疑就有了递归过程中的重复项。
代码中设置了f
数组,用于保存每一级的运算结果,即对于任意一个f
只需要计算一次即可,大大减少了重复运算。
因此算法的时间复杂度为O(n);
如有错误和可以改进的地方,欢迎私信交流
因为每次计算一个F
都会计算F[n-1]和F[n-2],而F[n-1]和F[n-2]的下一个子问题有很多的相同项,这无疑就有了递归过程中的重复项。
代码中设置了f
数组,用于保存每一级的运算结果,即对于任意一个f
只需要计算一次即可,大大减少了重复运算。
因此算法的时间复杂度为O(n);
//斐波那契数列的递归 动态规划解法 /*F(n)=F(n-1)+F(n-2) while n>2 else F(n)=1 */ #include<iostream> #include<vector> int n; //the goal of the scale std::vector<int> f; void getScale() { std::cout<<"please enter the scale of the question:"; std::cin>>n; f.push_back(1); //begin with the index of i=0 f.push_back(1); for(int i=2;i<=n;i++) f.push_back(0); } //define the function of recursion int Fibonacci(int n) { if (n<=1) return 1; if (f !=0) return f ; else return f =(Fibonacci(n-1)+Fibonacci(n-2)); } int main() { getScale(); std::cout<<Fibonacci(n); }
如有错误和可以改进的地方,欢迎私信交流
相关文章推荐
- 强化学习(三)用动态规划(DP)求解
- 动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。通常许多
- 动态规划练习题:概率DP总结,求解数学期望或概率的题目
- 动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。通常许多子问题非-
- DP思想在斐波那契数列递归求解中的应用
- leetcode 327. Count of Range Sum 字段和问题 + 动态规划DP解决 + 字段数 + 暴力求解真好
- 分治法与动态规划求解斐波那契数列
- java实现动态规划求解矩阵连乘问题
- DP 动态规划 Problem K 1011 蜜蜂爬蜂房
- 51Nod 1049 最大子段和(DP动态规划)
- 动态规划求解最长公共子序列(LCS)
- 买花瓶(简单动态规划DP)
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- poj 动态规划DP - 1125 Stockbroker Grapevine
- poj 3070 Fibonacci(矩阵加速DP)
- 什么样是动态规划(DP)问题?
- hdu_1078_FatMouse and Cheese_神奇的贪心_动态规划_算不上是dp
- LightOJ 1140 How Many Zeroes? [数位DP]【动态规划】
- 算法导论-----------------0-1背包问题dp求解
- DP 动态规划 Problem V 1022 反向考虑的背包