汉诺塔
初始状态
尝试进行如下操作:
1.将n - 1个盘子从A移动到C,B为辅助。
2.将最大盘即第n个盘子从A移动到B。
观察可发现,此时只要将在C的n - 1个盘子移动到B即可解决整个问题。
即此时将n - 1个盘子从C移动到B,A为辅助是一个规模更小的子问题。(最大盘在B等价于B处为空) 子问题找到了,然后调用递归即可。
代码如下
public class 汉诺塔 {
public static void main(String[] args) {
// TODO Auto-generated method stub
f(3,"A","B","C");
}
// 打印N个盘子从from到to以help为辅助的汉诺塔问题的移动路径,
private static void f(int n, String from, String to, String help) {
if(n == 1){
System.out.println("move " + n + " from " + from + " to " + to);
return;
}
// 還原新局面
f(n - 1,from,help,to);
System.out.println("move " + n + " from " + from + " to " + to);
// 還原完成
f(n - 1,help,to,from);
}
}
动态规划
// 递推公式f(n) = 2f(n-1)+1
private static int f(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
for (int i = 1; i < dp.length; i++) {
dp[i] = 2 * dp[i - 1] + 1;
}
return dp[n];
}