したがって、これを行う方法、および/またはこれを最適化する方法があります。私は愚かですが、すぐに再帰関数を実装したいのですが、後でセグメンテーション違反が発生し、動的計画法を採用しようとしましたが、うまくいったようですが、どういうわけか間違った答えが返ってきました。
ここでの問題
これが私のコードです、そしてそれはかなり自明だと思います。
#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)も合格しました。しかし、それは問題ではないようでした。
コードを修正し、使用する方法を変更したくないのですが、もちろん、再帰を使用することはできず、代わりにメインでループを使用します。これはオーバーフローしません。しかし、それは楽しいです。