出栈 记忆搜索+卡特兰数

https://www.luogu.org/problemnew/show/P1044

 

1.用dfs来做,记录以备用

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stdlib.h>
 8 #define mem(a) memset(a,0,sizeof(a))
 9 using namespace std;
10 long f[20][20];
11 long dfs(int x,int y) //x外,y内
12 {
13     if(f[x][y]!=0) return f[x][y];
14     else
15     {
16       if(x==0)return 1; //外面没有后,只有栈里有,也只有一种可能
17       if(y>0)  f[x][y]+=dfs(x,y-1); //从栈出
18       f[x][y]+=dfs(x-1,y+1); //从外入
19       return f[x][y];
20     }
21 
22 }
23 int main()
24 {
25   int n;
26   mem(f);
27   cin>>n;
28   cout<<dfs(n,0)<<endl;
29   return 0;
30 }
View Code

2.卡特兰数

设某位置为k,则比k早进栈且早出栈的有k-1个数,则有h(k-1)种可能,同理比k晚的有h(n-k)方案。 所以

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)=C(2n,n)/(n+1)   //k的所有位置的可能性

//如果把数组定义在main里面 要初始化

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stdlib.h>
 8 #define mem(a) memset(a,0,sizeof(a))
 9 using namespace std;
10 int f[20];
11 int main()
12 {
13   int n;
14   scanf("%d",&n);
15   f[0]=1; f[1]=1;
16   for(int i=2;i<=n;i++)
17   {
18       for(int j=0;j<i;j++)
19         f[i]+=f[j]*f[i-j-1];
20   }
21   printf("%d\n",f[n]);
22   return 0;
23 }
View Code

 

转载于:https://www.cnblogs.com/XXrll/p/10224454.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值