状压WA40求助(期望得分60)
查看原帖
状压WA40求助(期望得分60)
556362
Unnamed114514楼主2023/3/9 23:22
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,k,pre[20][1<<20];
double dp[20][1<<20];
struct point{
	double x,y;
	int id;
	inline bool operator <(const point &o) const{
		return x<o.x||(x==o.x&&y<o.y);
	}
}p[maxn];
inline double f(double t){
	return t*t;
}
inline double d(int a,int b){
	return f(p[a].x-p[b].x)+f(p[a].y-p[b].y);
}
double dfs(int now,int s){
	if(s==(1<<n)-1)
		return 0;
	if(dp[now][s]>=0)
		return dp[now][s];
	double res=1e20;
	int ans=0;
	for(int i=1;i<=n;++i)
		if(!(s&(1<<i-1))){
			double p=dfs(i,s|(1<<i-1))+d(i,now);
			if(p<res)
				res=p,ans=i;
		}
	pre[now][s]=ans;
	return dp[now][s]=res;
}
void ask(int now,int s){
	printf("%d ",p[now].id);
	if(s==(1<<n)-1)
		return;
	ask(pre[now][s],s|(1<<pre[now][s]-1));
}
int main(){
//	freopen("tree.in","r",stdin);
//	freopen("tree.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%lf%lf",&p[i].x,&p[i].y);
		p[i].id=i;
	}
	k=1;
	for(int i=2;i<=n;++i)
		if(p[i].y>p[k].y)
			k=i;
	for(int i=1;i<=n;++i)
		for(int j=0;j<(1<<n);++j)
			dp[i][j]=-1;
	dfs(k,1<<k-1);
	ask(k,1<<k-1);
	return 0;
}
2023/3/9 23:22
加载中...