在动态规划里记忆化搜索和递推的区别总结
记忆化搜索
记忆化搜索是采用自顶向下,将主问题拆分成子问题,其中对子问题的解会进行存储,这点上不同于分治法。
适用于动态规划公式比较复杂,且递归层次不深的问题
递推
递推是采用自底向上,逐步得出答案。
适用于动态规划公式比较简单明了的问题,可以防止递归层次过深的问题
例子:如斐波拉数列
采用记忆化搜索:
#include<bits/stdc++.h>
using namespace std;
int dp[105];
int find(int x){
if(dp[x]!=0) return dp[x];
else{
dp[x]=find(x-1)+find(x-2);
return dp[x];
}
}
int main(){
dp[0]=1;
dp[1]=1;
int x;
cin>>x;
cout<<find(x)<<endl;
return 0;
}
采用递推:
#include<bits/stdc++.h>
using namespace std;
int main(){
int dp[105];
dp[0]=1;
dp[1]=1;
int n;
cin>>n;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
cout<<dp[n]<<endl;
return 0;
}