C SPOJ与递归方法

C SPOJ与递归方法,c,algorithm,segmentation-fault,dynamic-programming,C,Algorithm,Segmentation Fault,Dynamic Programming,我最近开始解决DP问题,我遇到了硬币。我试着用DP和memonization来解决这个问题,如果我使用int数组(我猜)的话,效果会很好。 以下是我的方法(只剩下少量修改): #包括 #包括 int dp[100000]; 长-长最大值(长x,长y) { 如果(x>y) 返回x; 其他的 返回y; } int main() { int n,i; scanf(“%d”和“&n”); dp[0]=0; 对于(i=1;i极限说n极限说n汉克斯人!这帮了大忙!我想知道我在哪里可以联系你,或者看到你的解决

我最近开始解决DP问题,我遇到了硬币。我试着用DP和memonization来解决这个问题,如果我使用int数组(我猜)的话,效果会很好。 以下是我的方法(只剩下少量修改):

#包括
#包括
int dp[100000];
长-长最大值(长x,长y)
{
如果(x>y)
返回x;
其他的
返回y;
}
int main()
{
int n,i;
scanf(“%d”和“&n”);
dp[0]=0;

对于(i=1;i极限说
n极限说
n汉克斯人!这帮了大忙!我想知道我在哪里可以联系你,或者看到你的解决方案仅供参考。另外,这是遵循递归方法的常见技巧吗?当nYeah…这减少了时间流形。你必须始终以这样的方式选择递归的基本情况,以便递归被最小化。这是因为,递归是一把双刃剑。虽然它有助于减少代码长度,但如果递归堆栈太深,它会导致堆栈溢出,这也会导致SIGSEGV。(自己尝试一下,在spoj中的任何图形问题中,只有使用DFS才能解决,并且对(E,V)有很好的限制。),使用递归进行尝试,会导致这种情况。当您迭代实现DFS的相同逻辑时,它将很容易运行)此外,尽可能避免使用递归。在系统内存中构建递归堆栈在时间和内存上都是一个昂贵的过程。就联系我而言,随时都可以。我每天至少浏览一次一些帖子,在那里我可以提供帮助。你也可以在FB上找到我:)
#include <stdio.h>
#include <stdlib.h>
int dp[100000];
long long max(long x, long y)
{
   if (x > y)
      return x;
   else
      return y;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    dp[0]=0;
    for(i=1;i<=n;i++)
    {
        dp[i]=max(i,dp[i/2] + dp[i/3] + dp[i/4]);
    }
    printf("%d\n",dp[n]);

    return 0;
}
long long dp[1000000] = {0};
for(int i = 1; i < 1000000; i++){
    dp[i] = max(i, dp[i/2] + dp[i/3] + dp[i/4]);
}
ans = coins(n);
long long coins(long long n){
    if (n < 1000000)
        return dp[n];
    return coins(n/2) + coins(n/3) + coins(n/4);
}
#include<stdio.h>
long long dp[1000000] = {0};

long long max(long long a, long long b){
    return a>b?a:b;
}

long long coins(long long n){
    if (n < 1000000)
        return dp[n];
    return coins(n/2) + coins(n/3) + coins(n/4);
}

int main(){
for(long long i = 1; i < 1000000; i++){
    dp[i] = max(i, dp[i/2] + dp[i/3] + dp[i/4]);
}
long long n;
while(scanf("%lld",&n) != EOF){
    printf("%lld\n", coins(n));
}
return 0;
}