日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目解答
      • 題目鏈接

題目解答



來源:acwing

分析:

本題的漢諾塔問題是n個盤子4個塔,最基本的漢諾塔是n個盤子3個塔。本題是要在后者的基礎上來做。

設d[i]表示i盤3塔問題的最小移動步數
遞推公式是:d[i]=2×d[i?1]+1d[i] = 2 \times d[i -1] + 1d[i]=2×d[i?1]+1
解釋:共有A、B、C3個塔,把前i-1個盤子從A塔移動到B塔,然后A塔剩余的最后一個盤子移到C塔,最后把B塔的i-1個盤子移到C盤。

對于本題呢?

設f[i]表示i盤4塔問題的最小移動步數
遞推公式是:f[i]=min(f[i],2×f[j]+d[i?j])f[i] = min{(f[i], \ 2 \times f[j] + d[ i - j])}f[i]=min(f[i],?2×f[j]+d[i?j])

解釋:共有A、B、C、D4個塔, 初始化f[1] = 1, 表示 1個盤子從A移到D只需要1步。
具體過程:先把j個盤子從A塔移到B塔(這是在4塔問題),然后把 i - j個盤子移到D塔(這是在3塔問題,因為B塔被用了),然后再把B塔上的j個盤子移到D塔(這是在4塔問題)。當然,所有情況取最小值。

ac代碼

#include<bits/stdc++.h> using namespace std; const int N = 15 ; int d[N],f[N]; int main(){// 先處理 只有3個塔的情況d[1] = 1; //初始化:1個盤子移到終點for(int i = 2; i <= 12; i ++){d[i] = 2* d[i -1] + 1;}// 處理4個塔的情況memset(f, 0x3f, sizeof f);f[1] = 1; // 1個盤子移到終點// 把j個盤子放到一邊// 把剩余的 i -j個盤子放到終點// 再把j個盤子放到終點for(int i = 2; i <= 12; i ++)for(int j = 1; j <= i; j++)f[i] = min( f[i], 2* f[j] + d[i - j]);for(int i = 1; i<= 12; i ++) cout << f[i] << endl; }

題目鏈接

https://www.acwing.com/problem/content/98/

參考題解
https://www.acwing.com/solution/content/2473/

總結

以上是生活随笔為你收集整理的《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。