诡异的dp(凸多边形分割):catalan数

凸多边形分割

这道题拿道题没有一点思路。我一直在想如何把问题变小,然而一无所获(不是有漏项。就是有重复),最后不得不看了题解,发现这道dp题果然很诡异

设dp(i)表示i边形的方案个数

在一个i边形中,任取两个点,令一个点为1,一个点为i,那么其他点为2——i-1

在点集{2--i-1}中任取一个点k

那么连接k,1,n可以构成一个三角形

设上方区域为1区域三角形区域为2区域,下放区域为3区域

对于k说,设k左边为r变形,k右边为c变形

那么对于k这个点的分割方案,就是

dp(r)*dp(c)
因为i边形拥有点集{2--i-1}

那么对于每一个点都有一种方案分割情况

所以状态转移方程就出来了dp(i)=∑dp(j)*dp(i-j+1)(1<=j<=i-1)(很神奇对不对)

后来才知道,这就是Catalan数,高兴,终于推出来了

下面附上代码

#include<cstdio>
#define N 200+10
long long f[N], n;
using namespace std;
long long dp(int i)
{
    if(i==2 or i==3 )return f[i]=1;
    if(f[i])return f[i];
    long long t=0;
    for(int j=2;j<=i-1;j++)
    {
////        printf("1\n");
        t=(t+dp(j)*dp(i-j+1))%1234567;
    }
    return f[i]=t;
}
int main()
{
    scanf("%lld",&n);
    printf("%lld",dp(n));
    return 0;
}

Catalan数应用很多,作为一个oier,应该好好掌握

附上一个讲解Catalan数的blog  http://www.cnblogs.com/yaozhongxiao/archive/2009/11/10/1600516.html

时间: 2024-08-29 14:36:24

诡异的dp(凸多边形分割):catalan数的相关文章

【catalan数】10076 - 凸多边形分割

[catalan数]10076 - 凸多边形分割 Time Limit: 1000MS Memory Limit: 32768KB 这题不能用通项公式 我忘记了mod不支持除法 我忘记了mod不支持除法 1 # include<cstdio> 2 # include<iostream> 3 using namespace std; 4 const int maxn=250; 5 typedef unsigned long long LL; 6 LL f[maxn]; 7 int m

Catalan数的部分应用

卡特兰数用于解决一些特定的排列问题,一般是求解有多少种排列.. Catalan数的定义: (1)当n=1时,C(1)=1. (2)当n>1时,C(n) = C(1)*C(n-1) + C(2)*C(n-2) + ... + C(n-1)*C(1) (3)当然,也可以这样算: (4)当然,还能这样算: (5)更厉害的,是可以这样算,只是不大准而已: (ps:这些都是经过证明的公式) 注:所有的奇卡塔兰数(即n为奇数)Cn都满足. 一般来说,求卡特兰数有个基本问题,而其他问题一般可以转成这个问题.这

Catalan数 &amp;&amp; 【NOIP2003】出栈序列统计

令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) =h(n-1)*2(2n-1)/(n+1) 具体推导请百度,这里只需记得推导公式为h(n)=h(n-1)*2(2n-1)/(n+1)即可. 我们来说说这个的应用吧,从catalan数的定义递归定义可以看出,它是由自己 本身的一部分和n减去一部分 的和得到的,也就是说,有n个物品,1个物品进行操作1,n-

【noi 2.6_9288】&amp;【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度)

题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变形.(推荐阅读:http://www.cnblogs.com/chenhuan001/p/5157133.html).P.S.不知我之前自己推出的公式“C(n,m)*C(2*m,m)/(m+1)*P(n,n)*P(m,m)”是否是正确的. (1)在不考虑m人和n人本身组内的排列时,总方案数为C(m+

UVA 10312 - Expression Bracketing(数论+Catalan数)

题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Expression Bracketing 题意:有n个x,要求分括号,推断非二叉表达式的个数. 思路:二叉表达式的计算方法就等于是Catalan数的,那么仅仅要计算出总数,用总数减去二叉表达式个数.得到的就是非二叉表达式的个数. 那么计算方法是什么呢. 看题目中的图,对于n = 4的情况,能够分为这几种情况来讨论

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人

关于Catalan数

问题的由来:编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种? 对问题的转化与思考:n 个元素进栈和出栈,总共要经历 n 次进栈和 n 次出栈.这就相当于对这 2n 步操作进行排列.问题等价于:n个1和n个0组成一2n位的2进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少? 解答: 设P2n为这样所得的数的个数. 在2n位上填入n个1的方案数为 C(n 2n)不填1的其余n位自动填以数0.从C(n 2n)中减去不符合要求的方案数即为所求

(转载)Catalan数——卡特兰数

Catalan数--卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数) 问题描

ZOJ 2711 Regular Words (三维Catalan数)

题目链接:ZOJ 2711 Regular Words (三维Catalan数) 题意:给出一串3*n长度的字符,其中是含有A,B,C,满足以下条件的字符串有多少种. 1.字符串中A,B,C的个数相同. 2.该字符串的前缀中 A,B,C的个数成非递减. 做法一:一个三维的Catalan数. 做法二:三维的DP. AC代码: import java.math.*; import java.util.*; public class Main{ public static void main(Stri