剛剛做的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 標頭檔案引用的較多...