UVA_10254
如果我们设f[i]为4个柱子时把i个东东从一个柱子移到另一个柱子所用的最少步骤,设g[i]为3个柱子时对应的值,我们可以得到f[n]=min{2*f[k]+g[n-k]},其中g[i]是已知的为2^i-1。
然后接着就搞不下去了,看了别人报告说要找规律,o(╯□╰)o。有了上面的式子之后,我们打印前60个解还是很好打印的,同时把f[i]-f[i-1]也打印出来,这时会发现f[i]-f[i-1]都是2的某次方,而且2的k次方一共连续出现了k+1次,于是我们就可以以这个特征为依据预处理出所有解了。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger[] f = new BigInteger[10010];
f[0] = new BigInteger("0");
int k = 1, cnt = 0;
BigInteger d = new BigInteger("1");
for(int i = 1; i <= 10000; i ++)
{
f[i] = f[i - 1].add(d);
cnt ++;
if(cnt == k)
{
cnt = 0;
k ++;
d = d.multiply(BigInteger.valueOf(2));
}
}
while(cin.hasNext())
{
int n = cin.nextInt();
System.out.println(f[n]);
}
}
}