求卡常(玄关)
  • 板块学术版
  • 楼主CQBZ_ZJYjoe
  • 当前回复20
  • 已保存回复21
  • 发布时间2024/9/3 17:09
  • 上次更新2024/9/3 21:39:49
查看原帖
求卡常(玄关)
592080
CQBZ_ZJYjoe楼主2024/9/3 17:09

站外题,用不了火车头

#include<iostream>
#define min(x,y) ((x>y)?y:x)
#define sqr(x) ((x)*(x))
int main()
{
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	register int n,x[25],y[25],dp[(1<<24)+1],i,j,k,tx,tot,dist[25][25];
	std::cin>>x[0]>>y[0]>>n;
	for (i=1;i<=n;i++)
		std::cin>>x[i]>>y[i];
	for (i=0;i<=n;i++)
		for (j=0;j<=n;j++)
			dist[i][j]=sqr(x[i]-x[j])+sqr(y[i]-y[j]);
	tot=(1<<n);
	dp[0]=0;
	for (i=1;i<tot;i++)
	{
		for (j=1;j<=n;j++)
		{
			if ((i&(1<<(j-1))))
			{
				tx=i^(1<<(j-1));
				dp[i]=(dp[tx]+(dist[j][0]<<1));
				for (k=1;k<=n;k++)
					if ((tx&(1<<(k-1))))
						dp[i]=min(dp[i],dp[tx^(1<<(k-1))]+dist[j][0]+dist[j][k]+dist[k][0]);
				break;
			}
		}
	}
	std::cout<<dp[tot-1];
}
2024/9/3 17:09
加载中...