日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

96. 奇怪的汉诺塔【递推】

發布時間:2025/3/20 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 96. 奇怪的汉诺塔【递推】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是一道很經典的問題。


先看3個塔的情況
需要注意的是,這里的漢諾塔移動并無只可以移動到相鄰塔的需求。即可以直接從A移到C。
設d[i]表示將i個盤子從這里移到其他除它之外塔的步數 ,總塔的數量為3
故d[i]=d[i-1]+d[i-1]+1 即將i-1個盤子移到B,將i號盤子移動C,再將i-1個盤子從B移到C

接下來分析4個塔的情況
設f[i]表示將i個盤子從這里移到其他除它之外塔的步數,總塔的數量為4
f[i]=min(f[i],f[j]+f[j]+d[i-j]) 將j個盤子移到一個柱子,此時的j個盤子已經占了一個柱子,故剩余的i-j個盤子按照三個盤子的套路移動到D,再將j個盤子弄到D
這里都是f[j]是因為,移開的時候好分析,有三個柱子可以用,回來的時候因為我們排好的盤子在D柱子已經是大的盤子,故不影響還是f[j]

#include<bits/stdc++.h> using namespace std; const int N=15; int f[N],d[N]; int main(void) {d[1]=1;for(int i=2;i<=12;i++) d[i]=d[i-1]*2+1;memset(f,0x3f,sizeof f);f[1]=1;for(int i=2;i<=12;i++)for(int j=1;j<i;j++) f[i]=min(f[i],f[j]*2+d[i-j]);for(int i=1;i<=12;i++) cout<<f[i]<<endl;return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的96. 奇怪的汉诺塔【递推】的全部內容,希望文章能夠幫你解決所遇到的問題。

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