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:是的,我在发布答案之前也被接受了:)