必三更起五更眠;最無益,莫過一日曝十日寒。
【回溯法】出棧序列統計
時間限制: 1 Sec 內存限制: 128 MB提交: 17 解決: 11
[提交][狀態][討論版]
題目描述
輸入
輸出
樣例輸入
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; }