ACM_漢諾塔問題(遞推dp)


Problem Description:

最近小G迷上了漢諾塔,他發現n個盤子的漢諾塔問題的最少移動次數是2^n-1,即在移動過程中會產生2^n個系列。由於發生錯移產生的系列就增加了,這種錯誤是放錯了柱子,並不會把大盤放到小盤上,即各柱子從下往上的大小仍保持如下關系 :
n=m+p+q 
a1>a2>...>am
b1>b2>...>bp
c1>c2>...>cq
小G希望聰明的你能告訴他所有會產生的系列總數。

Input:

輸入一個N,N<30

Output:

對於每組數據,輸出移動過程中所有會產生的系列總數

Sample Input:

1
3

Sample Output:

3
27
解題思路:這道題跟 杭電hdu1996漢諾塔VI 幾乎一樣。在正確的擺放規則下,問題求解轉化為把n個盤子分開擺在3個塔上出現的所有可能情況數,每個盤子有3種放置選擇,簡單地推導一下公式:可得3n(n<30).
AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 int n;
 5 int main()
 6 {
 7     LL a[35]={1};
 8     for(int i=1;i<35;i++)
 9         a[i]=a[i-1]*3;
10     while(cin>>n){
11         cout<<a[n]<<endl;
12     }
13     return 0;
14 }
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM