我正在尝试解决此问题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;
}
不是应该相反吗?我真的很困惑。
答案 0 :(得分:0)
根据我的理解,迭代解在n中是线性的,即O(n),而递归解是O(log_2 n)。