1 条题解
-
0
// 60分代码
#include<bits/stdc++.h> using namespace std; int a[25][25],n,ans; bool v[210]; void dfs(int x,int dep,int s) { if(ans<=s) return ; if(dep==n) { ans=min(ans,s+a[x][n]);return ; } for(int i=2;i<n;i++) { if(v[i]==0) { v[i]=1; dfs(i,dep+1,s+a[x][i]); v[i]=0; } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]); memset(v,0,sizeof(v));v[1]=1;v[n]=1; ans=999999999; dfs(1,2,0);//当前在1号点(一开始可以从任意点出发),准备找第2个点 printf("%d\n",ans); return 0; }// 100分代码,状态压缩
#include<bits/stdc++.h> using namespace std; int a[25][25]; int f[(1<<20)][21]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]); memset(f,63,sizeof(f)); f[1][1]=0; for(int i=1;i<=(1<<n)-1;i++) { for(int j=1;j<=n;j++)if((i&(1<<(j-1)))>0) { for(int z=1;z<=n;z++)if((i&(1<<(z-1)))==0) { f[i+(1<<(z-1))][z]=min(f[i+(1<<(z-1))][z],f[i][j]+a[j][z]); } } } printf("%d\n",f[(1<<n)-1][n]); return 0; }
- 1
信息
- ID
- 1113
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 58
- 已通过
- 29
- 上传者