漢諾塔系列專題(逐步理解遞推遞迴)

2021-07-10 19:08:05 字數 2730 閱讀 1659

最裸的漢諾塔:

第一步:把n-1個盤子移到b柱

第二步:把第n個柱子移到c柱

第三步:把n-1個盤子移到c盤

第一步和第三步是一樣的,如果只需要求最少的步數,可以不管中間步驟,用遞推直接寫出即可

核心**

a[1]=1;

for(int i=2;i<=n;i++)

a[i]=2*a[i-1]+1;

最裸的弄懂當然是遠遠不夠的,現在我們來看一些變形

hdu2175

輸入n,m,問初始有n個盤子,問第m次移動的盤子號

咋看很麻煩,其實也是很簡單的啦!

比如有4個盤子,我要看第4步的盤子。如果我3個盤子都移到目的柱,那一共需要7步,如果把2個盤子都移到目的柱那一共需要3步,所以第4步移動的盤子一定在前3個盤子中。

而我們可以利用這種思想不斷遞推/遞迴也行,直到正好等於把某些盤子移動到目的柱。

#include #include#includeusing namespace std;

typedef long long ll;

ll n,m,a[64],b[64];

void inial()

}int sovle()

if(m==b[t])

return t+1;

m-=b[t-1];

}}int main()

void sovle(int s,int t,int z,int n)

void sovle(int s,int t,int z,int n)

m-=a[k];

int d=(n-k)&1;

if(d==0)

swap(z,t);

if(m==0)

len[s]++;

qu[s].push(k+1);

return;

}len[t]++;

qu[t].push(k+1);

if(m==1)

return;

}m--;

sovle(z,t,s,k);

}int main()

printf("\n");}}

return 0;

}

hdu1995

問題把n個盤子移到目的柱,問第k個盤子在這過程中一共移動了多少次。

看上去很複雜的樣子,但仔細想一想,第n個盤子只需要1次,第n-1個盤子只需要移動2次,你可以這麼遞迴下去,當然有感覺的也可以直接找到規律,不說了,上**

#include #include#include#includeusing namespacestd;

typedef

long longll;

intt,n,k;

intmain

()return0;

}

hdu1996

問n個盤子,移動到目的柱的過程中(不考慮最優的情況)會產生序列的總數,low題,每個哦案子不就可以在三個柱子上麼,3的階層就行了

#include #include#include#includeusing namespace std;

typedef long long ll;

ll a[31];

void inial()

int main()

return 0;

}

上面兩題算是休息,現在來看看更加深入,更加有趣的漢諾塔,hdu1997,自己看題意啊

這題是不是一看到就把人嚇到了,對於這種問題,肯定是遞迴的啦!現在的問題是遞迴什麼,如果你要遞迴每一步,肯定會爆掉。我們要弄清楚我們可以確定什麼,由於最裸的公式,我們可以確定,n在a或c,如果n確定了,那麼我們需要考慮n-1。如果n在a,那還處於最裸的公式中的第一步,那麼n-1只有在a或b,目的柱是b,起點是a,中間點是c。如果n到c,那一定經歷過了第一步,那麼n-1要麼在c要麼在b,起點是b,中間點是a,目的點是c

#include #include#includeusing namespace std;

const int m=70;

int t,n,len[4],a[4][m],no[4],f=-1;

void input()

int main()

for(int i=2;i<=20;i++)

}int main()

{ inial();

int n,m;cin>>n;

for(int i=0;i>m;

cout<

規則又做了一次改變,這次有了四根柱子,這題的難點在於慣性思維(慣性思維害死人啊!!!),大家都用遞推來做,其實是裡面柔和了dp。大家自己感受下來自世界的深深的惡意。

#include #include#includeusing namespace std;

double a[65],b[65];

void inial()

{ b[1]=1;

for(int i=2;i<65;i++)

b[i]=2*b[i-1]+1;

a[1]=1;

a[2]=3;

for(int i=3;i<=64;i++)

{a[i]=b[i];

for(int j=1;j

遞推遞迴 D 漢諾塔系列1

題目 解題思路 實在是學生愚鈍,看了半天題目就是沒看懂什麼意思,但是看樣例輸入與輸出之間可能跟三有關係,用計算機計算了一下3的29次方剛好是第三個輸出。然後就直接寫 了。include using namespace std int main long long i,j,n,k,a 1000 a 1...

HDOJ 漢諾塔系列(遞推分析)

漢諾塔v 設當有n個盤子時,第i個盤子從乙個柱子移到另乙個柱子需要移動的步數為f n,p 則有 當n p時 即p是最底下的那個盤子 f n,p 1 而當n!p時,p要跟著上面n 1個盤子先移動到b柱子,等n移到c後再移到c柱子。所以此時f n,p 2 f n 1,p view code includ...

漢諾塔 遞迴

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