UVa 100

今天也算是练习了一下记忆化搜索,这道题也包含很多值得注意的地方

1、  输入的两个数不一定前者比后者大

2、  变换的过程中可能会超出int范围

3、  为了不超时可以作下预处理

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXINT 1000001
int res[MAXINT];
int dfs(long long t)
{
if(t<=1) return 1;

if(t<=MAXINT && res[t]!=0) return res[t];
if(t>MAXINT)
{
if(t%2==0)
return dfs(t/2)+1;
return dfs(3*t+1)+1;
}
if(t%2==0)
res[t]=dfs(t/2)+1;
else
res[t]=dfs(t*3+1)+1;
return res[t];
}
int main()
{
int i,m,n,temp,max;
for(i=1;i<=1000000;i++) res[i]=dfs(i);
while(scanf("%d %d",&n,&m)!=EOF)
{
printf("%d %d ",n,m);
if(n>m) temp=n,n=m,m=temp;
max=0;
for(i=n;i<=m;i++)
{
if(max<res[i]) max=res[i];
}
printf("%d\n",max);
}
return 0;
}



posted @ 2012-02-28 18:17  书山有路,学海无涯  阅读(179)  评论(0编辑  收藏  举报