Algorithm 如何使用动态规划不同函数调用的数量与数组允许的最大大小相比太大

Algorithm 如何使用动态规划不同函数调用的数量与数组允许的最大大小相比太大,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我正在举办一些编程比赛。。。。。。。。。。。。。。我已经解决了一个与动态规划有关的问题。下面是这个问题的链接 我已经给出了这个问题的解决办法如下-: #include<stdio.h> short int moves[10000000]; int minimum(int a ,int b, int c) { if(a<b) if(a<c) return a; else retur

我正在举办一些编程比赛。。。。。。。。。。。。。。我已经解决了一个与动态规划有关的问题。下面是这个问题的链接

我已经给出了这个问题的解决办法如下-:

#include<stdio.h>
short int  moves[10000000];

int minimum(int a ,int b, int c)
{
    if(a<b)
        if(a<c)
            return a;
        else
            return c;
    else
        if(b<c)
            return b;
        else
            return c;
}

int FindMoves(int strength)
{
    int m1=0,m2=0,m3=0;
    int isBy2=0,isBy3=0;
    if(strength==1)
    {
        moves[1]=0;
        return 0;
    }
    else if(strength==2)
    {
        moves[2]=1;
        return 1;
    }
    else if(strength==3)
    {
        moves[3]=1;
        return 1;
    }
    else if(strength==4)
    {
        moves[4]=2;
        return 2;
    }
    else if(strength==5)
        {
            moves[5]=3;
            return 3;
        }
    else
    {
        if(moves[strength-1]!=-1)
        {
            m1=moves[strength-1];
        }
        else
        {
            m1=FindMoves(strength-1)+1;
            moves[strength-1]=m1;
        }
        if(strength%2==0)
        {
            isBy2=1;
            if(moves[strength/2]!=-1)
            {
                m2=moves[strength/2];
            }
            else
            {
                m2=FindMoves(strength/2)+1;
                moves[strength/2]=m2;
            }
        }
        if(strength%3==0)
        {
            isBy3=1;
            if(moves[strength/3]!=-1)
            {
                m3=moves[strength/3];
            }
            else
            {
                m3=FindMoves(strength/3)+1;
                moves[strength/3]=m3;
            }
        }
        if(isBy2 && isBy3)
        {
            return minimum(m1,m2,m3);
        }
        else if(isBy3)
        {
            if(m1<m3)
                return m1;
            else
                return m3;
        }
        else if(isBy2)
        {
            if(m1<m2)
                return m1;
            else
                return m2;
        }
        else
        {
            return m1;
        }
    }
}

int main()
{
    int i,t;
    int result;
    unsigned long int a[1000];
    scanf("%d",&t);
    for(i=0;i<t;i++)
    {
    scanf("%d",&a[i]);
    }
    for(i=0;i<1000000;i++)
    {
        moves[i]=-1;
    }
    for(i=0;i<t;i++)
    {
    result = FindMoves(a[i]);
    printf("%d\n",result);
    }
    return 0;
}
#包括
短整数移动[10000000];
最小整数(整数a、整数b、整数c)
{

如果(a最好不要使用移动[10000000],而是使用映射。您不需要覆盖从1到10^9的所有整数,只需使用

/2或(-1&then/2),以适用者为准


和(/3)或(-1&then/3)或(-1,-1&then/3),以适用者为准,对于(t=)1000个测试用例,您将很快得到解决方案。

请在这里描述问题,删除所有不必要的讲故事,并解释您的方法(特别是DP状态).我觉得你的代码不太直观。此外,我们不是来查找你的bug的,但是如果你的初始方法有问题,我们可能会提供帮助you@Niklas...实际上,我解决这个问题的方法是采取所有可能的情况,并将子问题的结果存储在数组中,所以每当子问题重复出现时,我不会解决它,而是获取值从存储的一个(我已存储在移动数组中)。我的问题是子问题的n个数太多,无法放入数组(最坏情况下为10^9)。因此,我正在寻找其他解决方案或我做错的任何事情……正如我所说的,请描述问题,描述您的方法,并告诉我们您的具体问题所在。您可以编辑问题,因为您仍然没有包括您要解决的任务的描述……我必须按什么顺序应用这些条件。。。…我是否应该检查所有条件,然后找到最小值(我也尝试过,但在发布答案时出现了超时错误,没有数组只是递归)…只有/2或(-1&then/2)中的一个适用,同样适用于(/3)或(-1&then/3)或(-1,-1&then/3)也只有其中一个是适用的。你能通过pastebin或其他类似网站发布你修改的代码吗。我已经在这里上传了修改后的代码……。这不是正确的答案,请解释一下。我看到了你的代码。你已经将逻辑设为贪婪而不是dp。你必须同时执行操作/2和/3以及sto是的,我已经确定了问题并更正了代码…………现在它在我上传的地方工作得很好……。非常感谢……。我也在寻找我在这里发布的另一个问题的答案。。。。。。