【悬赏 1~2关注】TLE求助
查看原帖
【悬赏 1~2关注】TLE求助
767861
Melo_BBB楼主2023/11/19 19:01

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;
}
2023/11/19 19:01
加载中...