题目大致:给定1~N这N个整数,和一个无限大的栈,每个数都要进栈并且出栈一次。如果进栈的顺序为1,2,~ N,那么可能的出栈序列有多少种呢?(这个问题很好,好在它展现了一个问题解的多样性,也是算法由朴素到精炼的递进)
方法一:搜索(递归+枚举)O(2^N)
可以使用搜索,进行递归的枚举。其中递归要注意把一般问题转化为不断向问题边界递进的选择项。注意递归状态的还原。
问题的边界是:出栈数等于N
寻找在原问题和问题边界的变换路线:1、可以入栈下一项 2、可以弹出栈顶元素
#include <bits/stdc++.h>
using namespace std;
stack<int> s;
vector<int> v;
int n,step;
long long ans;
void dfs(int k)
{
if(step==n)
{
for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it;
cout<<endl;
ans++;
return;
}
if(!s.empty())
{
v.push_back(s.top());
s.pop();
step++;
dfs(k);
s.push(*--v.end()); v.pop_back(); ///递归的还原状态
step--; ///不要忘记
}
if(k<=n)
{
s.push(k);
dfs(k+1);
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans;
return 0;
}
方法二:递推 O(N^2)
待更新~~