题意:汉诺塔题目的变形,有4根柱子,可以把顶部的k个盘子移到最后的柱子上,然后按照汉诺塔,问最后走的最小步数。
思路:递推,经过递推可以发现f[n] = f[k]*2+g[n-k],其中f[n]为4个柱子时的最小步数,g[n]为3根柱子的最小步数。要用java大数来解决。
code:
import java.math.*;
import java.util.Scanner;public class Main {public static void main(String args[]){BigInteger f[] = new BigInteger[10010];f[0] = BigInteger.valueOf(0);f[1] = BigInteger.valueOf(1);int i = 2;int k=1;while(i <= 10000){BigInteger add = BigInteger.valueOf(1).shiftLeft(k);for(int j=0; j<k+1 && i<=10000; ++j){f[i] = f[i-1].add(add);++i;}++k;} Scanner cin = new Scanner(System.in);while(cin.hasNext()){int n = cin.nextInt();System.out.println(f[n]); }}
}