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

时间:2014-03-19 18:04:48

标签: algorithm dynamic-programming

我正在进行一些编程竞赛..............我已经解决了与动态编程相关的一个问题。下面是问题的链接

Prblem link

我已经按照以下方式解决了问题 - :

#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;
}

在上面的解决方案中,我采用了数组move []。这个数组将保留子问题的结果。在FindMove函数中,如果问题的大小很小,它会将该子问题的结果存储在maves中数组和返回。

如果子问题的大小很大,那么我已经调用了函数FindMoves()三次(一个用于强度-1,第二个用于强度/ 2如果可以被2整除,第三个用强度/ 3可以被3整除)和最后从三个中取出最少。

当问题的大小在数组大小(1-10 ^ 6)中时,上面的解决方案正常工作,但由于我的数组大小为10 ^ 6,因此不适用于大小超过10 ^ 6。

当输入的大小太大时,上面的解决方案不起作用(问题强度在1到10 ^ 9之间)但是我的数组大小比那个小。(我不能拿更多因为如果我需要更多我收到内存超出错误)

如果你没有遇到我的问题,可以在这里找到同样的问题。

http://www.codechef.com/wiki/tutorial-dynamic-programming

我的问题只是我正在使用动态编程(带递归),当问题的大小太大时,我的解决方案无效,因为我的数组大小不是太大

请建议我做什么...... 任何帮助将不胜感激.......

1 个答案:

答案 0 :(得分:2)

最好不要使用移动[10000000]而是使用地图。您不需要覆盖1到10 ^ 9的所有整数,而只需使用

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

和(/ 3)或(-1&amp; then / 3)或(-1,-1&amp; then / 3)无论哪种情况适用,您都可以快速获得(t =)1000个测试用例的解决方案