记一次惨痛的刷题经历,
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 ",i,j,max); } return 0; }