求助
查看原帖
求助
1083200
guojiahong楼主2024/9/9 18:13
#include<bits/stdc++.h>
using namespace std;
const int INF=1e9;
int n;
int a[21][21],dp[21][(1<<20)],u,from;
void dg(int need,int now,int num)
{
	if(need>0&&num>n)return ;
	if(need==0)
	{
		dp[u][now]=min(dp[u][now],dp[from][now-(1<<(u-1))]+a[from][u]);
		return ;
	}
	from=num;
	if(now^(1<<(num-1))==now+(1<<(num-1)))dg(need-1,now+(1<<(num-1)),num+1);
	dg(need,now,num+1); 
	return ;
}
int main(){
	freopen("P1171_1.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<(1<<n);j++)
			dp[i][j]=INF;
	dp[1][1]=0;
	for(int i=1;i<n;i++)
		for(int j=1;j<=n;j++)
		{
			u=j;
			dg(i,(1<<(j-1)),1);
		}
	int ans=INF;
	for(int i=2;i<=n;i++)ans=min(ans,dp[i][(1<<n)-1]+a[i][1]);
	printf("%d",ans);
	return 0;
}
/*
下面是测试点 1
输入: 
5
0 9 3 7 8 
1 0 5 9 3 
4 6 0 8 6 
4 3 6 0 9 
9 10 2 1 0
我的输出: 
25
正确的输出:
14
*/
2024/9/9 18:13
加载中...