分类:
2008-04-20 22:40:01
#include <iostream>
using namespace std;
// 问题中指明了测试数据的最大值为10000.这里多加了一个1,以使得数组是从1开始,而不是0.
#define MAX_INT 10001
// 对于Memoization技术来说,我们需要定义一个缓存,以及一个函数。这个函数是必要的。
// 当我们取数是,不要直接从缓存中取,而是通过这个函数。
int count[MAX_INT];
int GetCount(int n);
int main() {
int p, q, r;
int i;
for (i = 0; i < MAX_INT; i++)
count[i] = 0;
count[1] = 1;
while (cin >> p >> q) {
cout << p << " " << q << " ";
if (p > q) { // 注意,这里是必须的。因为题目中并没有告诉我们p一定会小于q。
int temp = q;
q = p;
p = temp;
}
int max = GetCount(p);
for (int i = p+1; i <= q; i++) {
int temp = GetCount(i);
if (temp > max)
max = temp;
}
cout << max << endl;
}
}
// 计算对于与n的值。如果n小于MAX_INT,该值可能存于count中。对于大于MAX_INT的n,
// 需要重复计算,但我们假定这样的数字不会很多,因而重复的次数不会很多。
int GetCount(int n) {
int result = 0;
// 对MAX_INT的测试我觉得是必须的。因为n可能会大于MAX_INT。尽管我们知道测试数据都会小
// 与MAX_INT。但是可能存在这样的一个数t, 它是奇数,那么我们就会计算t*3+1,而t*3+1可能
// 会大于MAX_INT。
if (n < MAX_INT && count[n] != 0)
return count[n];
if (n%2 == 0) {
result = GetCount(n/2) + 1;
} else {
result = GetCount(n*3+1) + 1;
}
if (n < MAX_INT)
count[n] = result;
return result;
}