题目链接:14.Longest Collatz sequence
题意:
如果一个数 n 为偶数,那么 n = n / 2
如果一个数 n 为奇数,那么 n = n * 3 + 1, 默认每个数都可以转换到1
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
13的链长为 10
问 : 小于一百万的数字中 哪个数字的链长最长
解题思路:
这个网站是只要答案,所以暴力跑,可能20多秒就跑出来了,但是还是最好运用算法,记忆化搜索。节省大量时间
从上面可以看出, 如果40的链长已经已知,那么 13 的链长就是 40的链长加1,后面的也一样
用一个数组进行记录就行
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000000;
int a[maxn];
int get(ll x) { // 此处需要长整型,否则会溢出
if(x == 1) {
return 1;
}
if(x < maxn && a[x] != 0) { // 如果获取到了当前数字的链长,直接返回就行
return a[x];
}
int k = 0;
if(x % 2 == 0) {
k = get(x/2) + 1; // 寻找 x/2 的链长 + 1就行
} else if(x*3+1) { // 同理
k = get(x*3+1) + 1;
}
if(x < maxn) {
a[x] = k; // 只有小于maxn的数才记录,否则没意义(而且数组长度也太大)
}
return k;
}
int main() {
int ans = 1;
for(int i = 1; i < maxn; i++) {
a[i] = get(i);
if(a[i] > a[ans]) {
ans = i;
}
}
cout << ans << endl;
return 0;
}