做题看到有这么一题很有意思,记录一下
第二个问题只要把字母放在前面然后进行穷举就行了,第一个问题有些困扰
方法一 穷举法
A. 1个元素入栈出栈一种可能记作f(1) = 1;
B. 2个元素入栈出栈有两种可能记f(2) = 2;
C. 3个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置2种,第三个位置f(2)种,记作f(3) = 5;
D. 4个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置(前面只有一个元素pop出去了,在3个push任意位置插入一个pop)有3种可能,第三个位置(说明已经pop出去两个元素,考虑1-3三个数,pop其中两个,若两个连续有前面f(2)种,不连续只有一种,即num_pop(1,2) = 2,num_pop(2,3)=2,num_pop(1,3)=1)有共5种可能,第四个位置pop即为前面f(3)的值,即f(4) = 1 + 3 + 5 + 5 = 14种。
E. 5个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置(前面有4个元素选择一个pop)有4种可能,第三个位置(说明已有两个元素pop出去,若为pop的为1,2有2种,1,3有一种,1,4有1种,若pop的为2,3有2种,pop2,4有1种,pop3,4有2种)共计9种,第四个位置(说明已经pop出去三个元素,那么假设1未被pop,有f(3)种,2未被pop有f(2)种,3未被pop有f(2)种,4未被pop有f(3)种)共14种,第五个位置即f(4),因此f(5) = 1 + 4 + 9 + 14 + 14 = 42种。
方法二 卡特兰数
方法三 利用代码
#include <iostream> #include <algorithm> #include <conio.h> using namespace std; int testify(int *a,int len) { int num0 = 0; int num1 = 0; for(int i=0;i<len;++i) { if(a[i] == 1) ++num1; else ++num0; if(num0 > num1) return 0; } return 1; } int main() { int m[10] = {0,0,0,0,0,1,1,1,1,1}; int count = 0; do{ if(testify(m,10)) ++count; }while(next_permutation(m,m+10)); cout<<"Total NO:"<<count<<endl; getch(); }