诡异的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

posted @ 2017-09-23 07:39  star_eternal  阅读(1070)  评论(0编辑  收藏  举报