AT_abc180_e [ABC180E] Traveling Salesman among Aerial Cities 题解

分析

1N17,一眼状压。

定义 fs,i 表示从 1 走到 i,且经过点的状态为 s 的最小代价。不难推出转移方程:fs+2j1,j=min(fs,i+vali,j)。其中 vali,j 表示从 i 走到 j 的代价。由于我们在最后还需要回到 1,所以答案就是 min{f2n1,i+vali,1|1in}

复杂度 O(2nn2)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline

const int N=18,M=1<<18;
int n;
int x[N],y[N],z[N];
int f[M][N];
int Min=1e18;

il void solve(){
	memset(f,0x3f,sizeof(f)),f[1][1]=0;
	cin>>n;
	for(re int i=1;i<=n;++i) 
		cin>>x[i]>>y[i]>>z[i];
	for(re int i=1;i<(1<<(n));++i)
	for(re int now=1;now<=n;++now)
	if((i>>(now-1))&1)
		for(re int j=1;j<=n;++j)
		if(!((i>>(j-1))&1))
			f[i+(1<<(j-1))][j]=min(f[i+(1<<(j-1))][j],f[i][now]+(abs(x[j]-x[now])+abs(y[j]-y[now])+max(0LL,z[j]-z[now])));
	for(re int i=1;i<=n;++i) 
		Min=min(Min,f[(1<<n)-1][i]+(abs(x[1]-x[i])+abs(y[1]-y[i])+max(0LL,z[1]-z[i])));
	cout<<Min;
	return ;
}

signed main(){
	solve();
	return 0;
}

posted @   harmis_yz  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示