Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ uva3n+;1个在C和x2B中+;用动态规划_C++_Algorithm - Fatal编程技术网

C++ uva3n+;1个在C和x2B中+;用动态规划

C++ uva3n+;1个在C和x2B中+;用动态规划,c++,algorithm,C++,Algorithm,因此,有一些方法可以做到这一点,和/或优化这一点。虽然我很愚蠢,但我立即想要实现一个递归函数,这后来导致了一个分段错误,然后我尝试采用动态规划,它似乎可行,但不知何故我得到了错误的答案 问题 这是我的代码,我认为这是非常不言自明的 #include <iostream> using namespace std; int cycleLength(long long int); int cycleLengthResult[1000000]; int main(int argc,

因此,有一些方法可以做到这一点,和/或优化这一点。虽然我很愚蠢,但我立即想要实现一个递归函数,这后来导致了一个分段错误,然后我尝试采用动态规划,它似乎可行,但不知何故我得到了错误的答案

问题

这是我的代码,我认为这是非常不言自明的

#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];
}
#包括
使用名称空间std;
整数循环长度(长整数);
整数循环长度结果[1000000];
int main(int argc,char*argv[])
{
int i=0,j=0,cur=0,max=0;
而(cin>>i>>j)
{

如果(i>j)//交换以确保i仔细阅读语句:

整数i和j在输出中的出现顺序必须与在输入中的出现顺序相同


因此,请在读取并打印保存的值后保存它们。

如果您对程序逻辑的代码进行注释,以便在出现错误时可以回顾代码,或者让代码更“可读”。通常情况下,这只是隐藏在程序某处的简单逻辑错误。您正在测试
cycleleLengthResult[arg-1]
,但是在哪里初始化数组(全部为零)?也许应该使用
int-cyclelelengthresult[1000000]={0}
@Need4Sleep你说得对,我可能会在第二天早上3点尝试发表评论。我试图添加一些评论,但我认为他们并没有向人们更清楚地解释事情。我在编写这些代码的过程中做了笔记。它们是为了演讲,但我认为这将成为一场特别令人悲伤的演讲。LOL@svetianov不,我不需要在这里初始化它们,它们被声明为全局的,这意味着默认情况下它们被初始化为0。我已经测试过了。好的,我会试试这个。谢谢!哇,你完全正确,这是唯一的错误。非常感谢!我立即得到了一个“接受”的答案。@ShaneHsu:是的,我在发布答案之前也被接受了:)