HDU 2077 漢諾塔IV 遞迴 通項公式

2021-06-17 14:15:00 字數 1017 閱讀 9296

剛剛做的hdu 2064很好找規律,

回憶一下:

b[1] = 2;

b[n] = b[n-1] *3 + 2;

可得b[n]= 3^n-1

不懂的傳送門

這題題目差不多,就是放寬條件,但只允許把最大的放在最上面。

其實我看的時候沒有仔細想。。。它的輸入已經暴露了它的公式。因為兩題差不多,所以應該也是與3的n次冪有關。計算3的10次為59049 超過了?等等/3看看!3的9次方為19683,於是大膽猜測公式為a[n]= 3^(n-1)+1,直接ac掉。

sample input21

10sample output

219684

那麼如何得到那個式子呢?

把n-2個移動到c,由於允許最大的那個盤子放上面,所以n-1到b,n到b,n-2到a,n到c,n-1到c,剩下的n-2和剛才那題一樣!

故得a[n] =b[n-2] *3 + 4;(注意這裡是b[n-2],不是a[n-2])

帶入剛才的式子得:a[n] =( 3^(n-2)-1)*3+4=3^(n-1)+1

那麼遞推式呢?有了通項公式,遞推式也呼籲而出:

a[1] = 2;

a[n] = a[n-1] *3 -2;

好了上**說到這了,**好像是多餘的了。。。^ ^

遞推版:

#include using namespace std;

const int maxn=64;

int main()

}

直接公式:

#include using namespace std;

int main()

{ int t;

scanf("%d",&t);

while(t--)

{ int n;

scanf("%d",&n);

long long x=1;

for(int i=1;i

HDU 2077 漢諾塔IV 題解

由題意得 1.此題相較於傳統的漢諾塔問題,多了乙個新限制 從左 右 邊到最右 左 邊時,必須經過中間 少了乙個舊限制 允許最大的盤子放到最上面 2.問題就變成了三個步驟 一 將 n 1 個盤子從最左邊移到中間,二 然後加 2 三 最後再將這 n 1 個盤子從中間移到最右邊 3.由於最大的盤子能夠承載...

HDU2077 漢諾塔IV 遞推做法

這道題目會用到hdu2064漢諾塔iii的遞推式,可以參考我的另一篇部落格 漢諾塔iii。本問題和iii的區別在於最後乙個圓盤,但恰恰因為最後乙個圓盤,之前的思路需要大的改動 因為我們不知道最後一塊圓盤到底是第幾塊 假設變數 設a i 為將第i塊圓盤從左邊移動到右邊 或從右到左 的步數 b i 為將...

漢諾塔 遞迴

個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...