¿¿¿¿¿¿
  • 板块P1433 吃奶酪
  • 楼主NianFeng
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/11 09:35
  • 上次更新2023/10/27 07:55:31
查看原帖
¿¿¿¿¿¿
670826
NianFeng楼主2022/10/11 09:35

状压dp,WA#3,#5,#12,#13,少了几个1(¿)

代码如下

#include <bits/stdc++.h>
using namespace std;
const int N=16;
int n;
double x[N],y[N];
double dist(int x1,int y1,int x2,int y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double f[N][1<<N];		//f[i][j(10110...)]:到第i个点时,路径为二进制下的j时的最短路径 
int main(){
	memset(f,127,sizeof(f));
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++){
		f[i][1<<(i-1)]=dist(0,0,x[i],y[i]);
	}
	for(int bit=1;bit<(1<<n);bit++){	//备注:不能到1<<n,那是n+1位的二进制数,到-1 
		for(int i=1;i<=n;i++){
			if(bit&(1<<(i-1))==0) continue;
			for(int j=1;j<=n;j++){
				if(i==j||bit&(1<<(j-1))==0) continue;
				f[i][bit]=min(f[i][bit],f[j][bit-(1<<(i-1))]+dist(x[i],y[i],x[j],y[j]));
			}
		}
	}
	double ans=1e9;
	for(int i=1;i<=n;i++){
		ans=min(ans,f[i][(1<<n)-1]);
	}
	printf("%.2f",ans);
	return 0;
}

样例没问题,求调

orz

2022/10/11 09:35
加载中...