[恢]hdu 1032
2011-12-26 12:12:51
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1032
题意:一个数,如果是奇数,变成3倍+1, 如果是偶数,变成原来的一半, 直到1为止,次数叫做循环长度。给一个范围,问范围内最大循环长度。
mark:100w,打表记忆化搜。询问次数不多,直接O(n)扫过就好,如果还严格些可以用RMQ。
代码:
# include <stdio.h>
int dp[1000010] = {0, 1, 2} ;
int dfs (long long num)
{
long long next = ((num&1) ? (num*3+1) : (num/2)) ;
if (num <= 1000000)
{
if (dp[num] != 0) return dp[num] ;
return dp[num] = 1+dfs(next) ;
}
return 1+dfs(next) ;
}
int max(int a, int b){return a>b?a:b;}
int min(int a, int b){return a<b?a:b;}
int main ()
{
int i, a, b, ans ;
for (i = 3 ; i <= 1000000 ; i++)
dfs(i) ;
// puts ("finish") ;
while (~scanf ("%d %d", &a, &b))
{
ans = 0 ;
for (i = min(a,b) ; i <= max(a,b) ; i++)
ans = max(ans, dp[i]) ;
printf ("%d %d %d\n", a, b, ans) ;
}
return 0 ;
}