经典的3n+1,没有想到这道题调了一个晚上.
在Project Euler上看过这道题,于是按照那道题写了个部分DP.然后诡异的WA了.
调啊,调啊,只找到了一个trick:输入的两个数不一定小数在前大数在后.
然后呢,我这个程序是search,可加了一个预处理,for i=1~10000 do dp[i]=f(i),然后调用f(i)的地方改成dp[i],就过不了,都鬼了...怀疑数据范围有问题.
search可以1s过掉.
/*
UVa 100; The 3n + 1 problem
- sqybi's code
*/
//for my winsty
//#define DEBUG
#include
using namespace std;
const int nn = 1000001, mm = 10001;
int l, r, ll, rr, maxa;
int f(int i)
{
if (i == 1)
return 1;
else if (i % 2)
return f(i*3+1)+1;
else
return f(i/2)+1;
}
int main()
{
#ifdef DEBUG
freopen("uva100.in", "r", stdin);
freopen("uva100.out", "w", stdout);
#endif
while (scanf("%d%d", &ll, &rr) != EOF)
{
l = ll;
r = rr;
if (l > r) swap(l, r);
maxa = 0;
for (int i = l; i <= r; ++ i)
if (f(i) > maxa) maxa = f(i);
printf("%d %d %d\n", ll, rr, maxa);
}
}
You May Like These:
2008年08月22日 at 08:36
话说觉得你可以把右上角的那个about me里的完全到小学加个实验班……
2009年02月26日 at 15:56
你确定这个程序不会stack overflow??
2009年02月26日 at 18:16
@nubix: 确定 因为递归层数不深
2009年02月26日 at 20:46
嗯,确实不深.
今天无聊,优化了一下你的代码.
short c[1000000] = {0};
int f(long long k){
int r = 0;
long long p = k;
while(k > 1){
if(k<1000000 && c[k])
return r+c[k];
k = k%2 ? (k*3+1) : k/2;
r++;
}
return c[p] = r+1;
}
2008年08月22日 at 17:02
懒得加...