又水了一发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 }
View Code

相关文章: