最后一个点T了,大概1.2~1.4s
#include<bits/stdc++.h>
using namespace std;
const int N=100;
typedef long long ll;
inline int read()
{
int n=0,x=1;char ch=getchar();
if(ch=='-') x=-1;
while(ch<'0'||'9'<ch)ch=getchar();
while(ch>='0'&&ch<='9'){n=n*10+ch-'0';ch=getchar();}
return n*x;
}
unsigned int m,n,g[N][N],ans=25*1000,min_[N][N],a[N][N],d[N];
bool b[N];
inline int minn(int x,int y)
{
if(x>y) return y;
else return x;
}
inline void dfs(int now,int c,int s)
{
if(s>=ans) return;
if(s+(n-c+1)>=ans) return;
if(c==n)
{
ans=minn(ans,s+d[now]);
return;
}
for(register int i=1;i<=n;i++)
{
if(b[a[now][i]])
{
b[a[now][i]]=0;
dfs(a[now][i],c+1,s+g[now][i]);
b[a[now][i]]=1;
}
}
return;
}
int main()
{
memset(b,1,sizeof b);
cin>>n;
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<=n;j++)
{
g[i][j]=read();
a[i][j]=j;
}
d[i]=g[i][1];
}
for(register int k=1;k<=n;k++)
for(register int i=1;i<=n;i++)
{
for(register int j=1;j<n-i;j++)
{
if(g[k][j]>g[k][j-1])
{
swap(g[k][j],g[k][j+1]);
swap(a[k][j],a[k][j+1]);
}
}
}
b[1]=0;
dfs(1,1,0);
cout<<ans;
return 0;
}