递归优化策略(记忆化)
优化
原因:有重复计算
解决方案:用数组记录下一些会重复用到的数据,方便直接调用
eg(虽然此题不适用)
long long pell(int m){ if(m==1){ return 1; }else if(m==2){ return 2; }else if(a[m]!=0)//判断是否算过 { return a[m];//算过的话直接调用 }else { a[m]=2*pell(m-1)+pell(m-2) ;//否则再进行运算 return a[m]; } }
1258数字金字塔
优化前:
#include<bits/stdc++.h> using namespace std; int R; int a[1005][1005]; int f(int m,int n){ if(m==R){ return a[m][n]; }else return a[m][n]+max(f(m+1,n),f(m+1,n+1)); } int main(){ cin>>R; for(int i=1; i<=R; i++){ for(int j=1; j<=i; j++){ cin>>a[i][j]; } } cout<<f(1,1)<<endl; return 0; } /*测试点 结果 内存 时间 测试点1 答案正确 620KB 6MS 测试点2 运行超时 556KB 1001MS 测试点3 运行超时 948KB 1000MS 测试点4 运行超时 1340KB 999MS 测试点5 运行超时 2548KB 1000MS 测试点6 运行超时 3320KB 1002MS 测试点7 运行超时 3856KB 1008MS 测试点8 运行超时 4128KB 1019MS 测试点9 运行超时 4480KB 1003MS 测试点10 运行超时 4524KB 996MS*/
优化后
#include<bits/stdc++.h> using namespace std; int R; int a[1005][1005]; int s[1005][1005]; int f(int m,int n){ if(m==R){ return a[m][n]; }else { if(s[m][n]==0){ s[m][n]=max(f(m+1,n),f(m+1,n+1)); } return a[m][n]+s[m][n]; } } int main(){ cin>>R; for(int i=1; i<=R; i++){ for(int j=1; j<=i; j++){ cin>>a[i][j]; } } cout<<f(1,1)<<endl; return 0; }

浙公网安备 33010602011771号