不要想了,我优化完了第10个测点还是挂
```cpp
#include <cstdio>
#define min(a , b) ((a) < (b) ? (a) : (b))
using namespace std;
#define N 21
int f[1<<(N-2)][N-1];
int map[N][N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
for(int j=1;j<(1<<(n-1));j++)
{
f[j][i]=1<<30;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
if(i!=1)
{
f[1<<(i-2)][i-1]=map[1][i];
}
}
for(int S=3;S<(1<<(n-1));S++)
{
for(int i=2;i<=n;i++)
{
if(S&(1<<(i-2)))
{
for(int j=2;j<=n;j++)
{
if(S&(1<<(j-2))&&i!=j)
{
int s=S^(1<<(j-2));
f[S][j-1]=min(f[S][j-1],f[s][i-1]+map[i][j]);
}
}
}
}
}
int ans=1<<30;
for(int i=2;i<=n;i++)
{
ans=min(f[(1<<(n-1))-1][i-1]+map[i][1],ans);
}
printf("%d\n",ans);
return 0;
}
```
by Winniechen @ 2017-08-28 19:45:13