又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧
CodeForces 438C:The Child and Polygon:
描述:给出一个多边形,求三角剖分的方案数(n<=200)。
首先很明显可能是区间dp,我们可以记f[i][j]为从i到j的这个多边形的三角剖分数,那么f[i][j]=f[i][k]*f[j][k]*(i,j,k是否为1个合格的三角形)
Code:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef pair<double,double> ii; 7 #define fi first 8 #define se second 9 #define maxn 410 10 #define mod 1000000007 11 int f[maxn][maxn],n; 12 ii a[maxn]; 13 inline double cross(ii x,ii y,ii z) { 14 return (y.fi-x.fi)*(z.se-x.se)-(y.se-x.se)*(z.fi-x.fi); 15 } 16 inline bool check() { 17 double ans=0; 18 for (int i=2;i<=n;i++) ans+=cross(a[1],a[i-1],a[i]); 19 return ans>0; 20 } 21 inline void revice(){ 22 for (int i=1,j=n;i<j;i++,j--) swap(a[i],a[j]); 23 } 24 int main(){ 25 scanf("%d",&n); 26 for (int i=1;i<=n;i++) scanf("%lf%lf",&a[i].fi,&a[i].se); 27 if (check()) revice(); 28 for (int i=1;i+1<=n;i++) f[i][i+1]=1; 29 for (int l=1;l<=n-1;l++) 30 for (int i=1;i+l<=n;i++) 31 for (int j=i+1;j<i+l;j++) 32 (f[i][i+l]+=f[i][j]*1ll*f[j][i+l]%mod*(cross(a[i],a[j],a[i+l])<0?1:0))%=mod; 33 printf("%d\n",f[1][n]); 34 return 0; 35 }