目录
很久之前学习的递归,解决的第一个问题就是斐波拉契数列问题:
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题目的特征:
-
最优子序列
-
重叠子序列
参考
https://blog.csdn.net/u013309870/article/details/75193592