洛谷 P1044 栈

题目传送门

解题思路:

建立数组f。f[i]表示i个数的全部可能性。

f[0] = 1, f[1] = 1; //当然只有一个

设 x 为当前出栈序列的最后一个,则x有n种取值

由于x是最后一个出栈的,所以可以将已经出栈的数分成两部分

  1. 比x小

  2. 比x大

比x小的数有x-1个,所以这些数的全部出栈可能为f[x-1]

比x大的数有n-x个,所以这些数的全部出栈可能为f[n-x]

这两部分互相影响,所以一个x的取值能够得到的所有可能性为f[x-1] * f[n-x]

另外,由于x有n个取值,所以

ans = f[0]*f[n-1] + f[1]*f[n-2] + ... + f[n-1]*f[0];

这,就是传说中的卡特兰数//原址:https://www.luogu.com.cn/blog/QiXingZhi/solution-p1044

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 
 4 using namespace std;
 5 
 6 int n,f[20];
 7 
 8 int main() {
 9     scanf("%d",&n);
10     f[1] = 1;
11     f[0] = 1;
12     for(int i = 2;i <= n; i++)
13         for(int j = 0;j < i; j++)
14             f[i] += f[j] * f[i-j-1];
15     printf("%d",f[n]);
16     
17     return 0;
18 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/12000027.html