题意:给出四柱汉诺塔上初始柱子上圆盘的数量n,问最优多少次移动可以移动到另一个柱子上。
题解:可以参考四柱汉诺塔之初步探究和四柱汉诺塔实现这两篇论文,理解四柱汉诺塔的原理。
但是这道题n是从1到10000,递归太多层,而且需要用到大数,所以要找规律,f[i] = f[i - 1] + 2^k,k从1开始每k+1次计算f[i]后增大1,初始f[1] = 1。
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] arge) {
BigInteger[] f = new BigInteger[10005];
BigInteger One = BigInteger.ONE;
BigInteger Zero = BigInteger.ZERO;
f[0] = Zero;
f[1] = One;
int i = 2, k = 1;
while (i <= 10000) {
BigInteger Add = BigInteger.valueOf(1).shiftLeft(k); //1 << k
for (int j = 0; j < k + 1 && i <= 10000; j++, i++)
f[i] = f[i - 1].add(Add);
k++;
}
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int n = cin.nextInt();
System.out.println(f[n]);
}
}