只有40分,其他都WA,向大佬们求助
查看原帖
只有40分,其他都WA,向大佬们求助
642429
Laplace_Song楼主2023/9/1 23:45
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cmath>
using namespace std;

double min(double a, double b)
{
	return a < b ? a : b;
}

int main()
{
	int n;
	scanf("%d", &n);
	double* arx = new double[n + 1];
	double* ary = new double[n + 1];
	double dis[16][16] = {0};
	for (int i = 1; i <= n; i++) { scanf("%lf%lf", &arx[i], &ary[i]); }
	arx[0] = ary[0] = 0;
	for (int i = 0; i <= n; i++)
	{
		for (int j = 0; j <= n; j++)
		{
			dis[i][j] = sqrt((arx[j] - arx[i]) * (arx[j] - arx[i]) + (ary[j] - ary[i]) * (ary[j] - ary[i]));
		}
	}
	int condition = (1 << n) - 1;
	double(*dp)[16] = new double[condition + 1][16];
	dp[0][0] = 0;
	for (int i = 0; i <= condition; i++)
	{
		for (int j = 1; j <= n; j++) dp[j][i] = 0x7fffffff;
	}
	for (int i = 1; i <= n; i++) dp[i][1 << (i - 1)] = dis[0][i];
	for (int i = 1; i <= condition; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (((1 << (j - 1)) & i) == 0) continue;
			for (int k = 1; k <= n; k++)
			{
				if (j == k || ((1 << (k - 1)) & i) == 0) continue;
				dp[j][i] = min(dp[j][i], dp[k][i - (1 << (j - 1))] + dis[k][j]);
			}
		}
	}

	double ans = 0x7fffffff;
	for (int i = 1; i <= n; i++) ans = min(ans, dp[i][condition]);
	printf("%.2lf", ans);
	return 0;
}
2023/9/1 23:45
加载中...