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

Posted star_eternal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了诡异的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

以上是关于诡异的dp(凸多边形分割):catalan数的主要内容,如果未能解决你的问题,请参考以下文章

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

catalan数

Catalan number (卡特兰数)

动态规划dp青蛙的烦恼

[程序员代码面试指南]字符串问题-回文最少分割数(DP)

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