【回溯法】出棧序列統計

必三更起五更眠;最無益,莫過一日曝十日寒。

【回溯法】出棧序列統計

時間限制: 1 Sec  內存限制: 128 MB
提交: 17  解決: 11
[提交][狀態][討論版]

題目描述

棧是常用的一種數據結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩·種:push和pop,前者是將一個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對於給定的n,計算並輸出由操作數序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。

輸入

一個整數n(1<=n<=15)

輸出

一個整數,即可能輸出序列的總數目。

樣例輸入

3

樣例輸出

5

 這裏用了回溯法做,n比較小的時候還可以通過,n>10後好像就會超時

在網上看到還可以用動態規劃來做

f[i][j]------i表示入棧的個數,j表示出棧的個數,入棧出棧序列的數目就轉化爲,從(0,0)到(n,n)共有多少條路徑可以到達。f[i][j]=f[i-1][j]+f[i][j-1]限制條件是i>=j。

#include <iostream>
#include <stack>

using namespace std;

int cnt;

void ff(stack<int> a,int i,int n)
{
    if(a.empty()&&i==n+1)
    {
        cnt++;
    }
    else
    {
        if(i==n+1)
        {
            a.pop();
            ff(a,i,n);
        }
        else
        {
            if(a.empty())
            {
                a.push(i);
                ff(a,i+1,n);
                a.pop();
            }
            else
            {
                a.push(i);
                ff(a,i+1,n);
                a.pop();
                a.pop();
                ff(a,i,n);
            }
        }
    }
}
int main()
{
    int n;
    stack<int> a;
    cin>>n;
    cnt=0;
    ff(a,1,n);
    cout<<cnt<<endl;
    return 0;
}
View Code

 

posted on 2016-08-08 11:53 asuml 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章