标签:namespace span 浅谈 数组 不同的 个数 blank pre scanf
引入:卡特兰数。
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。
——百度百科
#include <bits/stdc++.h> int n, f[30]; int main() { scanf("%d",&n); f[0]=1,f[1]=1; for(int i=2; i<=n; i++) for(int j=0; j<i; j++) f[i]+=f[j]*f[i-j-1]; //卡特兰数 printf("%d",f[n]); return 0; }
这里用了递推的算法。
还可以用递归实现:
#include<bits/stdc++.h> using namespace std; int h(int n)
{ if(n==0||n==1) return 1; return h(n-1)*(4*n-2)/(n+1);//公式 } int main(){ int n; cin>>n; cout<<h(n); return 0; }
·题目描述
Luogu P1044 栈 [原题链接]
·解析
本题的描述十分简单。n个数依次进栈,可随机出栈。求有几种可能。
DFS是可以解的,但仔细思考思考,就会发现一个更简单的方法。
我们不妨建立数组f。f[i]表示i个数进出的全部可能性。
那么f[0] = 1, f[1] = 1;(0个数或1个数也没什么其他可能了。)
若设 x 为当前出栈序列的最后一个,则x有n种取值
由于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];
显而易见——卡特兰数!
题目的数据范围很小,所以直接贴模板也是可以过的。
n对括号正确匹配数目:给定n对括号,求括号正确配对的字符串数。(h(n)种)
·经典必练
P1722 矩阵 II [原题链接]
标签:namespace span 浅谈 数组 不同的 个数 blank pre scanf
原文地址:https://www.cnblogs.com/-Wallace-/p/9869758.html