【刷题】【模拟】3n+1

记一次惨痛的刷题经历,

bfs:

首先,我从1 -> [i,j] 推step,

看起来很理想,实际上无用状态一大......

还忽略了3n+1数的奇妙轨迹问题......

所以这种数列还是不要反着推了,,太玄学

正着打表:

问题同上,不停的超出i,j范围,

还因为re时不时出现负数

正解:

部分记忆化

#include<cstdio>
#include<cstdlib>
using namespace std;
int i,j;
long long max;
long long t;
const int N=1000000;
long long d[N];
long long work(long long n)
{
    if(n==1) return 1;
    else
    {
        if(n<N&&d[n]!=0)
            return d[n];
        else
        {
            if(n%2==0)
            {
                t=work(n/2);
                if(n<N)
                    d[n]=1+t;
                return 1+t;
            }
            else
            {
                t=work(n*3+1);
                if(n<N)
                    d[n]=1+t;
                return 1+t;
            }
        }
    }
}
int main()
{
    while((scanf("%d %d",&i,&j))!=EOF)
    {
        max=0;
        for(int k=i;k<=j;k++)
        {
            long long a=work(k);
            if(a>max) max=a;
        }
        printf("%d %d %lld\n",i,j,max);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/xwww666666/p/11781137.html