N個數依次入棧,出棧順序有多少種?

來源:互聯網
上載者:User

標籤:

  對於每一個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態‘1’,出棧設為狀態‘0’。n個數的所有狀態對應n個1和n個0組成的2n位位元。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃描由n個1和n個0組成的2n位位元,1的累計數不小於0的累計數的方案種數。  在2n位位元中填入n個1的方案數為C(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃描,0的累計數大於1的累計數)的方案數即為所求。不符合要求的數的特徵是由左而右掃描時,必然在某一奇數位2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位元,即一個不合要求的數對應於一個由n+1個0和n-1個1組成的排列。  反過來,任何一個由n+1個0和n-1個1組成的2n位位元,由於0的個數多2個,2n為偶數,故必在某一個奇數位上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位元,即n+1個0和n-1個1組成的2n位元必對應一個不符合要求的數。因而不合要求的2n位元與n+1個0,n-1個1組成的排列一一對應。顯然,不符合要求的方案數為C(2n,n+1)。由此得出輸出序列的總數目=C(2n,n)-C(2n,n+1)=C(2n,n)/(n+1)=h(n+1)。 
//類比過程如下,dfs來填充入棧和出棧的標誌
#include<iostream> #include<cstring>#include<cstdio>#include<stack>#define N 100using namespace std;int a[N];int p[2*N];int pre[2*N];int used[2*N];int index[2*N];//如果a[i]==1,那麼表示第index[i]個數入棧 int n;int cnt;//記錄多少個出棧的序列 int C(int n){ int ans=1; int m = 2*n; int nn = n; for(int i=1; i<=n; ++i){ ans *= m--; ans /= i; } return ans/(nn+1);}void solve(){ memset(pre, 0, sizeof(pre)); memset(used, 0, sizeof(used)); int prek = 0; for(int i=1; i<=2*n; ++i){ if(a[i] == 1){ pre[i] = prek; prek = i; } else { int ii = prek; while(used[ii]) ii = pre[ii]; cout<<p[index[ii]]<<" ";//出棧 used[ii] = 1; pre[prek] = pre[ii]; } } cout<<endl;}void solve1(){ stack<int>s; int k=1; for(int i=1; i<=2*n; ++i){ if(a[i] == 1) s.push(p[k++]); else { cout<<s.top()<<" "; s.pop(); } } cout<<endl;}void dfs(int k, int cnt0, int cnt1){ if(k>2*n){ //solve(); solve1(); ++cnt; return ; } if(cnt1<n){//入棧 a[k] = 1; index[k] = cnt1+1;//第幾個數入棧 dfs(k+1, cnt0, cnt1+1); } if(cnt0<cnt1){//出棧 a[k] = 0; dfs(k+1, cnt0+1, cnt1); }}int main(){ cin>>n; for(int i=1; i<=n; ++i) cin>>p[i]; dfs(1, 0, 0); cout<<endl<<"類比個數:"<<cnt<<endl; cout<<"公式個數:"<<C(n)<<endl; return 0;}
類似問題 買票找零  有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)最終結果:C(2n,n)-C(2n,n+1)

N個數依次入棧,出棧順序有多少種?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.