题目是求三角剖分个数
令 fi,j 表示 i∼j 这些点组成的多边形的三角剖分方案数
我们找到一个点
k
,让
那么让
k
在向量
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=210,P=1e9+7;
typedef long long ll;
int n;
int f[N][N];
struct Pt{
ll x,y;
ll val(){
return x*x+y*y;
}
friend Pt operator -(const Pt &a,const Pt &b){
return {a.x-b.x,a.y-b.y};
}
friend bool operator ==(const Pt &a,const Pt &b){
return a.x==b.x && a.y==b.y;
}
friend bool operator !=(const Pt &a,const Pt &b){
return !(a==b);
}
}a[N];
inline int sgn(ll x){
if(x==0) return 0;
return x>0?1:-1;
}
inline ll cross(const Pt &a,const Pt &b){
return a.x*b.y-a.y*b.x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
ll area=0;
for(int i=1;i<=n;i++) area+=cross(a[i],a[i%n+1]);
if(area<0) reverse(a+1,a+1+n);
for(int i=1;i<n;i++) f[i][i+1]=1;
for(int k=3;k<=n;k++)
for(int i=1;i+k-1<=n;i++){
for(int j=i+1;j<i+k-1;j++)
if(cross(a[j]-a[i],a[i+k-1]-a[i])>0)
(f[i][i+k-1]+=1LL*f[i][j]*f[j][i+k-1]%P)%=P;
}
cout<<f[1][n]<<endl;
return 0;
}