Codeup 1095 火车出栈问题(2解法)

问题:设有编号为1到n的n辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
一:递归公式
计数原理中的乘法原理,总的可能性数量等于第一步的可能性数量和第二步的可能性数量之乘积。
以序号为n的列车为界,将列车分为两部分,一部分是在第n辆列车之前出栈的列车,另一部分是在第n辆列车之后出栈的列车。
设在n号列车之前出栈的列车数量为i(0<=i<n),则在n号列车之后出栈的列车数量为(n – 1 – i)。前i辆列车出栈的可能性数量有F(i),后(n – 1 – i)辆列车出栈的可能性数量有F(n – 1 – i),所以总的数量为F(i)* F(n – 1 – i)。
0<=i<=n-1,F[0]=1;
因此我们可以得到一个递归公式:
F(n) = F(0)*F(n-1) + F(1)*F(n-2) + F(2)*F(n-3) + … + F(n-1)*F(n-n);(其中n>=1,F(0) = 1)
 

#include<iostream>
#include<cstring>
using namespace std;
long long int F[10000];
int main()
{
 long long int n;
 memset(F,0,sizeof(F)); //将F数组所有元素全部设置为0
 F[0]=1; //边界值
 while(cin>>n)
 {
  for(int i=1;i<=n;i++)
  {
   if(!F[i]) //F[i]没有被求解过
   {
    for(int j=0;j<=i-1;j++)
     F[i]+=F[j]*F[i-1-j]; //根据公式求得这一项的值
   }
  }
  cout<<F[n]<<endl;
 }
 return 0;
}

运行过,满分。

 

二:公式法(容易忘,供了解)
这与Catalan(卡特兰)数极其相似——就是n的初值少1。
Catalan数的递归公式是
h(n) = h(1)h(n-1) + h(2)h(n-2) + …… + h(n-1)h(1) (其中n>=2,h(1) = 1)。
后来又有人得到一个另类的递归公式:
h(n) = ((4n – 2) / (n + 1)) * h(n-1)(其中n>=2,h(1) = 1)。
根据递归公式我们可以得到数列的通项公式:
h(n) = C(2n, n) / (n + 1) = (2n)! / (n! * n! (n + 1)) (其中n>=1)。
可化简
2n*(2n-1)…(n+1)/(n!(n+1))
原本担心ans会出现double类型不匹配的情况,后来发现没必要,因为实际情况,对任何n,都有唯一整数与其对应
 

#include<iostream>
using namespace std;
int main()
{
 int n;
 while(cin>>n)
 {
  long long int ans=1;
  for(int i=1;i<=n;i++)
   ans=ans*(n+i)/i;//不可ans*=(n+i)/i,因为先算后面可能落掉小数的精度
  cout<<ans/(n+1)<<endl;
 }
 return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值