从递归到DP——再看斐波拉契数列问题

目录

用递归解决:

换用DP:

注意:

DP题目的特征:

最优子序列

重叠子序列


很久之前学习的递归,解决的第一个问题就是斐波拉契数列问题:

https://blog.csdn.net/qq_41895747/article/details/100173991

从递归到DP解决01背包问题:

https://mp.csdn.net/postedit/103898847

用递归解决:

#include <iostream> 
using namespace std;
 
int fun(int n){
	if(n==1||n==2)
		return n;
	return fun(n-1)+fun(n-2);
}

int main(){
	int n;
	cin>>n;
	int num = fun(n);
	cout<<num<<endl;
	
	return 0;
}

这时,如果输入的n值过大的话,会导致递归过深栈溢出,使用动态规划可以减少不少运算量,即用空间换时间,这也是递归问题和DP问题之间的精髓

换用DP:

#include <iostream>
using namespace std;

int dp[100];

int  solution(int n){
	int dp[n+1];
	dp[1]=1;dp[2]=2;
	for (int i = 3; i <= n; ++i){
		dp[i] = dp[i-1] + dp[i-2];
	}
	return  dp[n];
}

int main(){
	
	int n;
	cin>>n;
	int num=solution(n);
	
	cout<<num<<endl;
	
	return 0;
} 

注意:

当输入的数比较大的时候,如50,结果已经超过了int的范围了,所以输出会出错,此时可改为long long int

DP题目的特征:

  1. 最优子序列

  2. 重叠子序列

参考

https://blog.csdn.net/u013309870/article/details/75193592

https://www.cnblogs.com/hapjin/p/5573419.html

https://www.cnblogs.com/wkfvawl/p/9362287.html

发布了228 篇原创文章 · 获赞 76 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/103915415