【YbtOJ高效進階 遞推-2】奇怪漢諾塔
連結
題目描述
漢諾塔問題,條件如下:
這裡有 A、B、C 和 D 四座塔。
這裡有 n個圓盤, n的數量是恆定的。
每個圓盤的尺寸都不相同。
所有的圓盤在開始時都堆疊在塔 A 上,且圓盤尺寸從塔頂到塔底逐漸增大。
我們需要將所有的圓盤都從塔 A 轉移到塔 D 上。
每次可以移動一個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓盤時,可將圓盤移至這座塔上。 請你求出將所有圓盤從塔 A 移動到塔 D,所需的最小移動次數是多少。
輸出
對於每一個整數n( 1 ≤ n ≤ 12 1\leq n \leq12 1≤n≤12) ,輸出一個滿足條件的最小移動次數,每個結果佔一行。
思路
我們先考慮三座塔的情況
肯定是先把
n
−
1
n-1
n−1個盤子放到B塔,然後把最後這個放到C塔,然後再把B塔的這
n
−
1
n-1
n−1個盤子放到C塔
所以很容易得到
a
i
=
2
∗
a
i
−
1
+
1
a_i = 2*a_{i-1} + 1
ai=2∗ai−1+1
那再來看回原題
四個塔,那我們是否可以視為是獨立一座塔和三座塔的處理呢?
我們列舉一個
j
j
j,表示
j
j
j個盤子放去B塔,然後剩下的再去放,最後再把這
j
j
j個盤子放到D塔
那很顯然,我們用
f
i
f_i
fi表示i個盤子的最少步數
則
f
i
=
m
i
n
1
≤
j
≤
i
(
2
∗
f
j
+
a
i
−
j
)
f_i = \underset{1\leq j \leq i}{min}(2*f_j + a_{i-j})
fi=1≤j≤imin(2∗fj+ai−j)
程式碼
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[15], f[15];
int main() {
a[1] = 1;
for (int i = 2; i <= 12; ++i) a[i] = 2 * a[i - 1] + 1;
memset(f, 0x3f, sizeof(f));
f[1] = 1;
for (int i = 1; i <= 12; ++i) {
for (int j = 0; j <= i; ++j) f[i] = min(2 * f[j] + a[i - j], f[i]);
printf("%d\n", f[i]);
}
}
相關文章
- 奇怪的漢諾塔 - 題解
- 漢諾塔和遞迴遞迴
- ybtoj高效進階題解索引索引
- ybtoj 高效進階題解索引索引
- 【ybtoj 高效進階 1.4】【深搜】數獨遊戲遊戲
- 經典遞迴解決漢諾塔!遞迴
- 漢諾塔非遞迴演算法遞迴演算法
- 遞迴實現漢諾塔問題遞迴
- 漢諾塔非遞迴棧程式碼遞迴
- c++遞迴與迭代實現漢諾塔C++遞迴
- 漢諾塔的圖解遞迴演算法圖解遞迴演算法
- SQL 漢諾塔SQL
- 從漢諾塔遊戲理解python遞迴函式遊戲Python遞迴函式
- python3:遞迴解漢諾塔問題Python遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- 漢諾塔詳解
- 漢諾塔-PythonPython
- ACM 漢諾塔(三)ACM
- 漢諾塔的實現
- 漢諾塔通項公式公式
- 化繁為簡 經典的漢諾塔遞迴問題 in Java遞迴Java
- 百練OJ:4147:漢諾塔問題(Hanoi)——python實現漢諾塔Python
- 小知識系列(3):Hanoi塔(漢諾塔,河內塔)
- 漢諾塔遊戲《演算法很美》遊戲演算法
- hanoi漢諾塔C++實現C++
- 漢諾塔演算法演示1.0演算法
- PHP實現漢諾塔演算法PHP演算法
- Python實現:漢諾塔問題Python
- 漢諾塔(hanoi) C語言實現C語言
- 第二章 :查詢與排序-------遞迴經典問題——漢諾塔問題排序遞迴
- YbtOJ 遞推演算法課堂過關 例5 平鋪方案【遞推(簡單DP)】演算法
- 《ybtoj高效進階》第一部分第五章例題5 機器維修
- 漢諾塔移動步數的計算 (轉)
- 漢諾塔與二進位制、滿二叉樹的千絲萬縷二叉樹
- js解決漢諾塔問題程式碼例項JS
- JAVA漢諾塔遞迴 之SpringCloud企業分散式微服務雲架構快速開發平臺Java遞迴SpringGCCloud分散式微服務架構
- js漢諾塔問題解決方法程式碼例項JS
- 【分治演算法】歸併排序,快速排序和漢諾塔演算法排序