在这种情况下,为什么递归解决方案比迭代解决方案更快?

时间:2019-07-16 19:13:56

标签: c++ recursion iteration dynamic-programming

我正在尝试解决此问题https://www.spoj.com/problems/COINS/

但奇怪的是,我的迭代解决方案:

#include <iostream>
using namespace std;

int main() {
    int n;
    while(cin >> n){
        long long int dp[n+2];
        dp[0]=0;
        for(long long int i=1; i<=n; i++)
            dp[i]=max(dp[i/2]+dp[i/3]+dp[i/4], i);
        cout << dp[n] <<endl;
    }
    return 0;
}

获得一个TLE,与此(不是我的)的递归解决方案很快就会被接受:

#include <cstdio>
#include <map>
#include <algorithm>

using namespace std;

map<int, long long> dp;

long long f(int n){
    if(n==0) return 0;

    if(dp[n]!=0) return dp[n];

    long long aux=f(n/2)+f(n/3)+f(n/4);

    if(aux>n) dp[n]=aux;
    else dp[n]=n;

    return dp[n];
}

int main(){    
    int n;

    while(scanf("%d",&n)==1) printf("%lld\n",f(n));

    return 0;
}

不是应该相反吗?我真的很困惑。

1 个答案:

答案 0 :(得分:0)

根据我的理解,迭代解在n中是线性的,即O(n),而递归解是O(log_2 n)。