诡异的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
夫君子之行,
静以修身,俭以养德;
非澹泊无以明志,
非宁静无以致远。
夫学须静也,才须学也;
非学无以广才,非志无以成学。
慆慢则不能励精,
险躁则不能冶性。
年与时驰,意与日去,
遂成枯落,多不接世。
悲守穷庐,将复何及!