Gym - 101986B Parallel Lines dfs暴力
阿新 • • 發佈:2018-12-23
連結:點選檢視
題意:偶數個點,兩點可連成一條線,求平行線最大對數
題解:當時想的時候傻逼了,想成了每次選兩個點就是16*15/2 * 14*13/2 .....
其實不需要這樣,因為每個點必須要匹配一個的,所以每次搜尋,給一個點找其他點即可,複雜度15*13*11.....
斜率用mp記錄一下即可 斜率為0 和 不存在的特殊標記
#include<bits/stdc++.h> using namespace std; map< int, map<int, int> > mp; struct node{ int x,y; }a[20]; int n, vis[20]; int ans; void dfs(int pos, int step, int sum) { if(step==n/2+1) { ans=max(ans, sum); return; } if(vis[pos]) dfs(pos+1, step, sum); else { vis[pos]=1; for(int i=pos+1;i<=n;i++) { if(vis[i]) continue; vis[i]=1; int kx,ky; if(a[i].y==a[pos].y) kx=ky=0; else if(a[i].x==a[pos].x) kx=ky=100000; else { ky=a[i].y-a[pos].y; kx=a[i].x-a[pos].x; int d=__gcd(abs(kx),abs(ky)); kx/=d;ky/=d; if(kx<0) kx=-kx,ky=-ky; } mp[kx][ky]++; dfs(pos+1, step+1, sum+mp[kx][ky]-1); mp[kx][ky]--; vis[i]=0; } vis[pos]=0; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); dfs(1, 1, 0); printf("%d\n",ans); return 0; }