Strange Towers of Hanoi
首先考虑三柱汉诺:
将 k-1 个盘子移动到B,最大的一个盘子移动到C,再将k-1个盘子移动到C
f ( k ) = 2 ∗ f ( k − 1 ) + 1 f(k) = 2*f(k-1)+1 f(k)=2∗f(k−1)+1
当 k 确定时 f ( k ) 的值不会变。
四柱汉诺塔
四汉诺塔的最优解是将所有盘子移动到D次数最少的情况。
设 g ( x ) 为 x 个盘子移动到 D 的最少移动次数,相应的 g ( x - k ) 也是对应
的移动最少次数。若存在 g2 ( x - k ) < g ( x - k ) 则用 g2 移动 x - k 个盘
子时,这与 g ( x ) 为最优解是矛盾的。所以本问题具有最优子结构性质。
g ( x ) = { 1 , if x =1 m i n ( 2 ∗ g ( x − k ) + f ( k ) ) , other g(x) = \begin{cases} 1, & \text{if $x$ =1} \\ min(2*g(x-k)+f(k)), & \text{other} \end{cases} g(x)={1,min(2∗g(x−k)+f(k)),if x =1other
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter pr = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
in.nextToken();
int n=(int)in.nval;
int[] f=new int[n+1];
int[] d=new int[n+1];
for(int i=1;i<=n;i++)
d[i]=(1<<i)-1;
int inf=1<<30;
for(int i=2;i<=n;i++)
f[i]=inf;
f[0]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
int t=2*f[i-j]+d[j];
if(t<f[i])
f[i]=t;
}
}
for(int i=2;i<=n;i++)
pr.println(f[i]);
pr.flush();
}
}