orz orz 40分求助
  • 板块P1433 吃奶酪
  • 楼主You_Quiet
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/9/25 20:44
  • 上次更新2023/10/27 09:57:29
查看原帖
orz orz 40分求助
421736
You_Quiet楼主2022/9/25 20:44
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
double f[100][100];
int n,cnt;
struct yq{
	double x,y;
}a[100];
double dp[20][32790];
int main()
{
	memset(dp,127,sizeof(dp));
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
	}
	a[0].x=0.0000000;
	a[0].y=0.0000000;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			f[i][j]=sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2));
			f[j][i]=f[i][j];
		}
	}//存图 
	cnt=pow(2,n);
	for(int i=1;i<=n;i++) dp[i][1<<(i-1)]=f[i][0];//初始化,只到i点的最优解为f[i][0]; 
	for(int i=1;i<=n;i++){//前一个点 
		for(int k=1;k<=n;k++){//要到达的点 
			if(i==k) continue;//i k相等不考虑 
			for(int j=0;j<=cnt-1;j++){
				if(1<<(k-1)&j==1) continue;//j状态中有k点,不考虑 
				if(i) if(1<<(i-1)&j==0) continue;//j状态中没i点,不考虑 
				if((j&(cnt-1)!=0)&&dp[i][j]==0) continue;//j状态中有点,但dp为0,不考虑 
				dp[k][j+(1<<(k-1))]=min(dp[k][j+(1<<(k-1))],dp[i][j]+f[i][k]);//改最优解 
			}
		}
	}
	double ans=10000000.000000;
	for(int i=1;i<=n;i++){
		ans=min(ans,dp[i][cnt-1]);
	}
	printf("%.2lf",ans);
}
2022/9/25 20:44
加载中...