DP,记搜不会写,爆搜TLE了,求正解()
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1002;
int n,m,d[N],ans,dist[N][N],res;
bool u[N];
struct Point{
int x,y;
Point(int x=0,int y=0):x(x),y(y){}
friend istream&operator>>(istream&in,Point&i){
in>>i.x>>i.y;
return in;
}
}r,b[1001],c[1001];
inline int dis(Point a,Point b){
return abs(a.x-b.x)+abs(a.y-b.y);
}
inline void dfs(int s,int res,bool unr){
if(res>=::res)
return;
if(n<s){
if(unr)
::res=min(::res,res);
return;
}
dfs(s+1,res+d[s],unr);
for(int i=1;i<=m;i++)
if(!u[i]){
u[i]=1;
dfs(s+1,res+dist[s][i],1);
u[i]=0;
}
return;
}
inline void Main(){
memset(u,0,sizeof(u));
ans=0,res=0x3f3f3f3f;
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=m;i++)
cin>>c[i];
for(int i=1;i<=n;i++){
d[i]=dis(b[i],r),ans+=d[i];
for(int j=1;j<=m;j++)
dist[i][j]=dis(b[i],c[j]);
}
cin>>r;
dfs(1,0,0);
cout<<ans+res<<'\n';
return;
}
signed main(){
ios::sync_with_stdio(0);
while(cin>>n>>m)
Main();
return 0;
}