凸n边形分解成n-2个小三角形之ZZNUOJ 告辞题解(卡特兰数)

E : 告辞

Progress Bar

时间限制:1 Sec 内存限制:256 MiB
提交:434 答案正确:105

题目描述

整个世界都在散发着恋爱的恶臭,只有spring依旧保持着单身贵族的清香。

spring单身久了,煮饺子看见两个黏在一起的都要强行分开,所以在看到凸n边形的时候,总是习惯性的拆分成n-2个小三角形,毕竟第三者插足是spring最喜闻乐见的,那么给出一个凸n边形,有多少种方法能够将凸n边形分解成n-2个小三角形。

输入

输入一个正整数n,表示有个凸n变形  2<n<30

输出

输出有多少种方法能够将凸n边形分解成n-2个小三角形。

样例输入

复制

3
5

样例输出

复制

1
5

提示

卡特兰数

令h(0)=1,h(1)=1,catalan数满足递推式 [2]  :

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

扫描二维码关注公众号,回复: 2377602 查看本文章

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

另类递推式 [3]  :

h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:

h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

递推关系的另类解为:

h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
#define N 100
ll dp[40];

int main()
{
    ll n;
    dp[1]=1ll;
      dp[2]=2ll;
      for(int i=3;i<=27;i++){
        dp[i]=2ll*(2ll*i-1ll)*dp[i-1]/(i+1ll);
      }

    while(scanf("%lld",&n)!=EOF){
      printf("%lld\n",dp[n-2]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/henu111/article/details/81207661