带有动态编程的C ++中的UVa 3n + 1

时间:2012-12-24 18:33:39

标签: c++ algorithm

因此,有办法做到这一点,和/或优化它。愚蠢的我,我立即想要实现一个递归函数,后来导致了一个分段错误,然后我尝试采用动态编程,它似乎工作,但不知怎的,我得到了错误的答案。

问题Here

所以这是我的代码,我认为这是不言自明的。

#include <iostream>

using namespace std;

int cycleLength(long long int);

int cycleLengthResult[1000000];

int main(int argc, char *argv[])
{
    int i = 0, j = 0, cur = 0, max = 0;
    while ( cin >> i >> j )
    {
        if ( i > j ) //swap to ensure i <= j
        {
            int s = i;
            i = j;
            j = s;
        }
        for ( int k = i ; k <= j ; ++ k )
        {
            cur = cycleLength(k);
            if (cur > max) max = cur;
        }
        cout << i << " " << j << " " << max << endl;
        max = 0;
    }
}

int cycleLength(long long int arg)
{
    if ( arg > 1000000 ) //if out of array bound, then don't memorize, just calculate
    {
        if (arg % 2 == 0)
        {
            return 1 + cycleLength(arg/2);
        }
        else
        {
            return 1 + cycleLength(arg*3+1);
        }
    }
    if (!cycleLengthResult[arg-1]) //if result for arg doesn't exist then....
    {
        int valueForArg = 0;
        if (arg == 1)
        {
            valueForArg = 1;
        }
        else if (arg % 2 == 0)
        {
            valueForArg = 1 + cycleLength(arg/2);
        }
        else
        {
            valueForArg = 1 + cycleLength(arg*3+1);
        }
        cycleLengthResult[arg-1] = valueForArg;
    }
    return cycleLengthResult[arg-1];
}

我通过了所有的样本输入,并且还通过了(1,1000000)进行速度测试。但似乎这不是问题所在。

我想修复我的代码,而不是改变使用的方法,当然,我可以不使用递归,而是在main中使用循环,这不会溢出。但它很有趣。

1 个答案:

答案 0 :(得分:2)

仔细阅读声明:

整数i和j必须按照它们在输入中出现的顺序出现在输出中

所以在阅读并打印保存的值后保存它们。