MLE求条
查看原帖
MLE求条
925129
DgNeHzL7777楼主2025/2/7 08:24
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
inline int read() {
	int x=0,y=1;
	char e=getchar();
	while(e<'0'||e>'9') {
		if(e=='-') y=-1;
		e=getchar();
	}
	while(e>='0'&&e<='9') {
		x=(x<<3)+(x<<1)+(e-'0');
		e=getchar();
	}
	return x*y;
}
int n,D;
double x[22],y[22];
double dp[22][1<<22];//飞到i状态为j
double f(double a,double b,double c,double d) { //(a,b),(c,d)
	return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double dis[22][22];
signed main() {
	memset(dp,0x7f,sizeof dp);
	memset(dis,0x7f,sizeof dis);
	dp[1][1]=0;
	n=read(),D=read();
	for(int i=1; i<=n; ++i) {
		scanf("%lf%lf",&x[i],&y[i]);
	}
	for(int i=1; i<=n; ++i){
		for(int j=1;j<=n;++j){
			double dist=f(x[i],y[i],x[j],y[j]);
			if(dist<=D)dis[i][j]=dist;
		}
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	for(int k=1; k<(1<<n); ++k) {
		for(int i=1; i<=n; ++i) {
			if(k>>(i-1)&1) {
				for(int j=1; j<=n; ++j) {
					if(i!=j&&(k>>(j-1)&1)) {
						if(dis[i][j]<=D)dp[i][k]=min(dp[i][k],dp[j][k^(1<<(i-1))]+dis[i][j]);
					}
				}
			}
		}
	}
	double ans=dp[0][0];
	for(int i=1; i<=n; ++i) {
		ans=min(ans,dp[i][(1<<n)-1]+dis[i][1]);
	}
	printf("%.2lf",ans);
	return 0;
}

写的状压DP但全MLE

2025/2/7 08:24
加载中...