ACM:3n + 1

时间:2013-10-22 06:37:17

标签: hud

3n + 1问题

时间限制:2000/1000 MS(Java / Others)内存限制:65536/32768 K(Java / Others) 提交总数:18416接受提交:6803

问题描述 计算机科学中的问题通常被归类为属于某类问题(例如,NP,不可解决,递归)。在这个问题中,您将分析算法的属性,该算法的分类对于所有可能的输入都是未知的。

考虑以下算法:

1.      input n

2.      print n

3.      if n = 1 then STOP

4.           if n is odd then n <- 3n + 1

5.           else n <- n / 2

6.      GOTO 2

鉴于输入22,将打印以下数字序列22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

推测上述算法将针对任何积分输入值终止(当打印1时)。尽管算法很简单,但不知道这个猜想是否正确。然而,已经证实,对于所有整数n,0 <0。 n&lt; 1,000,000(事实上,还有更多的数字。)

给定输入n,可以确定打印的数字(包括1)。对于给定的n,这称为n的循环长度。在上面的例子中,22的循环长度是16.

对于任何两个数字i和j,您要确定i和j之间所有数字的最大循环长度。

输入 输入将由一系列整数i和j组成,每行一对整数。所有整数将小于1,000,000且大于0.

您应该处理所有整数对,并且对于每对确定i和j之间的所有整数的最大循环长度。

您可以假设没有操作溢出32位整数。

输出 对于每对输入整数i和j,您应该输出i,j和i和j之间和之间的整数的最大循环长度。这三个数字应至少由一个空格分隔,一行中所有三个数字,每行输入一行输出。整数i和j必须以与它们出现在输入中相同的顺序出现在输出中,并且应该跟随最大循环长度(在同一行上)。

示例输入 1 10 100 200 201 210 900 1000

示例输出 1 10 20 100 200 125 201 210 89 900 1000 174

1 个答案:

答案 0 :(得分:0)

如果您使用普通方式。对于每种情况,请校准所有整数的解决方案。 因此,您可以为1到1,000,000之间的所有解决方案加密,而不是存储在数组中。 使用ST方式来计算新的dp [N] [M]。 比有查询时,你可以用O(1)次得到ans; 或者您可以使用细分树来获取ans。 但我不确定它不会得到TLE ......

for(int j=0;j<=log(N);j++)
    for(int i=1;i<=N;i++)
        dp[i][j]=max(dp[i][j-1]+dp[i+pow(2,j-1)][j-1];