求助,状压dp,样例过了,全TLE
查看原帖
求助,状压dp,样例过了,全TLE
593921
黄海辰楼主2023/3/31 19:57
#include <bits/stdc++.h>
using namespace std;
int n,d;
double x[21],y[21],r[21][21];
double dp[21][1<<21],ans=1000000005;
double ju(double x,double y,double xx,double yy) {
	return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
int main() {
	cin>>n>>d;
	for(int i=1; i<=n; i++) {
		cin>>x[i]>>y[i];
	}
	for(int i=1; i<=n; ++i) {
		for(int j=1; j<=n; j++)
			if(ju(x[i],y[i],x[j],y[j])<=d)
				r[i][j]=ju(x[i],y[i],x[j],y[j]);
			else r[i][j]=1000000003;
	}
	for(int k=1; k<=n; k++)
		for(int i=1; i<=n; i++)
			for(int j=1; j<=n; j++)
				if(i!=j&&j!=k&&i!=k)
					r[i][j]=min(r[i][j],r[i][k]+r[k][j]);
	for(int i=1; i<(1<<n); i++)
		for(int j=1; j<=n; j++)
			dp[j][i]=10000005;
	dp[1][1]=0;
	for(int i=0; i<(1<<n); i++) {
		for(int j=1; j<=n; j++) {
			if(i&(1<<(j-1))) {
				int x=i^(1<<(j-1));
				for(int k=1; k<=n; k++) {
					if((x&(1<<(k-1)))) {
						dp[j][i]=min(dp[j][i],dp[k][x]+r[j][k]);
					}
				}
			}
		}
	}
	for(int i=2; i<=n; i++)
		ans=min(ans,dp[i][(1<<n)-1]+r[i][1]);
	printf("%.2lf",ans);
	return 0;
}


2023/3/31 19:57
加载中...