【题目大意】:给出一个凸多边形,问将其划分成三角形和四边形有多少种划分方法。
【解题思路】:单单将这道题变成划分三角形,每个人无一例外的都会很快的反应到卡特兰数上去。
这道题的本质思路也跟卡特兰数相类似,也是一个递推或者说是dp的方法。
这里的思路引用了:http://hi.baidu.com/sunnyykn/blog/item/45b16d02cfdfb583d43f7c97.html
这样我们可以获得O(n^2).的做法。
这道题还有一个神奇的地方就是,它是用了unsigned long long的自爆形式来进行取模~当初第一次写的时候傻傻的写了个高精度,差点没挂在那里......
【代码】:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> using namespace std; unsigned long long u[5050],t[5050]; int main(){ u[0]=u[1]=u[2]=1; t[0]=t[1]=t[2]=1; // unsigned long long tmp=1; for (int i=3; i<=5000; i++){ u[i]=0; for (int j=2; j<=i-1; j++){ u[i]+=t[j]*t[i-j+1]; } t[i]=u[i]; for (int j=2; j<=i-2; j++){ t[i]+=t[j]*u[i-j+1]; } } for (int i=3; i<=5000; i++)cout << t[i] << endl; }