奇怪的漢諾塔
首先打表出只有三根柱子時1~12個圓盤所需的次數,思路是這樣的,對於三根柱子,首先將前i-1個圓盤移動到某一根柱子,然後將最後一個圓盤移動到一根柱子,最後再將剩下的i-1個圓盤移動到一根柱子,所以 three[i] = three[i - 1] + 1 + three[i - 1]
對於四根柱子來說,列舉前j個圓盤,首先將前j個圓盤移動到四根柱子種的某一根,次數是 four[j]
,然後將剩下的i-j個圓盤移動到剩下的三根柱子,次數是 three[i-j]
(為什麼是三根柱子,因為之前已經有一根柱子被佔用了,所以這裡即使有四根柱子,也只有三根能用),最後再將那j個圓盤移回來,次數是 four[j]
,所以狀態轉移方程為 four[i] = min{four[i], four[j] + three[i - j] + four[j]}
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int[] three = new int[13]; for (int i = 1; i <= 12; i++) three[i] = three[i - 1] + 1 + three[i - 1]; int[] four = new int[13]; Arrays.fill(four, Integer.MAX_VALUE >> 1); four[0] = 0; for (int i = 1; i <= 12; i++) for (int j = 0; j < i; j++) four[i] = Math.min(four[i], four[j] + three[i - j] + four[j]); for (int i = 1; i <= 12; i++) System.out.println(four[i]); } }