c - 如何让下面的递归更快?

标签 c algorithm dynamic-programming

long long int num(int n,int m)
{
    long long int k,i;

    k=0;

    if(n>1)
    {
        for(i=0;i<=m;i++)
        {
            k+=((p[i]%MOD)*(num(n-1,i)%MOD))%MOD;
            k%=MOD;
        }

        return k;
    }
    else
        return q[m];
}

上面的代码是用 C 编写的,我需要让它运行得更快,数组 p[i],q[i] 是全局值,MOD 也是如此,有什么方法可以让它更快,可能是通过存储值或其他东西。我认为DP可以在这里使用,但我不确定该方法。

因为我被要求发布 p[i] 和 q[i] 以及 MOD ,所以它们总是 MOD =1000000000 。

void seive(int c)
{
    long long int i,temp;

    p[0]=1;
    q[0]=p[0];
    for(i=c+1;i<=(2*c+2);i++)
    {
        temp=((p[i-c-1]%MOD)*(c%MOD))%MOD;
        temp/=(i-c);

        p[i-c]=((p[i-c-1]%MOD)+(temp%MOD))%MOD;
        q[i-c]=((q[i-c-1]%MOD)+(p[i-c]%MOD))%MOD;

    }
}

c=m-1(第一个代码中的m和第二个代码中的c相关)

最佳答案

声明全局二维数组。

由于 MOD 没有改变,最初计算 p[i]=p[i]%MOD

% 运营成本较高

  long long temp[][];   // size can be max value of n and m  and initialize to LLONG_MIN

 long long int num(int n,int m) {

  long long int k,i;

  k=0;

 if(n>1)
 {
        for(i=0;i<=m;i++)
        {
              int h=0;
               if(temp[n-1][i]!= LLONG_MIN){
                 h=temp[n-1][i];
                }else{
                 temp[n-1][i]= num(n-1,i)%MOD;
                 h=temp[n-1][i];
                }
                k+=((p[i])*(h))%MOD;
                k%=MOD;
        }

        return k;
}

else
        return q[m];

}

关于c - 如何让下面的递归更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681439/

相关文章:

algorithm - 覆盖整个网格的随机路径

algorithm - 序列比对与动态规划

string - 瓦格纳-费歇尔算法

algorithm - 动态规划 : The Zipper

c - 让 gdb 与 emacs 24 一起工作

c - 链接列表 - 命令行参数

performance - 对这些时间复杂度进行排序

c - 功能修改

c# - bluemix vm openstack 使用c++语言

java - 列出 16x16x16 矩阵中可能存在的最大长方体