递归优化策略(记忆化)

优化

原因:有重复计算

解决方案:用数组记录下一些会重复用到的数据,方便直接调用

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;
}

 

posted @ 2023-07-21 15:21  竹余居居居居居  阅读(64)  评论(0)    收藏  举报