HDU 2077 漢諾塔IV【遞推】
阿新 • • 發佈:2019-02-12
Problem Description
還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是盤子從小到大排在最右邊。
Input 輸入資料的第一行是一個數據T,表示有T組資料。
每組資料有一個正整數n(1 <= n <= 20),表示有n個盤子。
Output 對於每組輸入資料,最少需要的擺放次數。
Sample Input 2 1 10
Sample Output 2 19684
Input 輸入資料的第一行是一個數據T,表示有T組資料。
每組資料有一個正整數n(1 <= n <= 20),表示有n個盤子。
Output 對於每組輸入資料,最少需要的擺放次數。
Sample Input 2 1 10
Sample Output 2 19684
/* a[i]表示將i個從最左移到最右且只能小在上大在下的最少步驟數 b[i]表示將i個從最左移到最右且允許最大放在最上面的最少步驟數 c[i]表示將i個從最左移到中間且只能小在上大在下的最少步驟數 顯然c[i]也可以表示將i個從最右移到中間且只能小在上大在下的最少步驟數 a[i]的實現過程: 由漢諾塔III可知:a[i]=3*a[i-1]+2; b[i]的實現過程:①將i-1個從最左移到中間且只能小在上大在下,即c[i-1] ②將最左最底下第i個移到中間i-1個的最上面 ③將中間最上的第i個移到最右 ④將中間i-1個移到最右且只能小在上大在下,即c[i-1]. 合計:b[i]=2*c[i-1]+2; c[i]的實現過程:①將i-1個從最左移到最右且只能小在上大在下,即a[i-1]; ②將最左最底下的第i個移到中間 ③將最右的i-1個移到中間且只能小在上大在下,即c[i-1]. 合計:c[i]=a[i-1]+c[i-1]+1; 初始化:a[1]=2;b[1]=2;c[1]=1. */ #include <stdio.h> #define maxn 21 int main() { long long a[maxn] = { 0,2 }, b[maxn] = { 0,2 }, c[maxn] = { 0,1 }; for (int i = 2;i < maxn;i++) { a[i] = 3 * a[i - 1] + 2; c[i] = a[i - 1] + c[i - 1] + 1; b[i] = 2 * c[i - 1] + 2; } int n, t; scanf("%d", &t); while (t--) { scanf("%d", &n); printf("%I64d\n", b[n]); } return 0; }