#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10;
const int mod = 1e9+7;
typedef long long ll;
typedef unsigned long long ull;
const ll INF = LLONG_MAX-100000000;
int n;
ll p[20][20];
ll dp[N][17][4];
void solve()
{
cin >> n ;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)cin>>p[i][j];
}
ll mx = 1;
for(int i=1;i<=n;i++)mx*=2;
mx--;
// cout<<mx<<' ';
for(ll i=mx;i>=0;i--)
{
for(int j=1;j<=n;j++)
{
dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=dp[i][j][3]=INF;
if(i==mx)dp[i][j][0]=0;
}
}
for(int i=mx;i>=0;i--)
{
if(i==mx)
{
for(int k=0;k<n;k++)
{
dp[i^(1<<k)][k+1][0] = 0;
}
continue;
}
for(int j=0;j<n;j++)
{
if(((i>>j)&1))continue;
for(int k=0;k<n;k++)
{
if(!((i>>k)&1))continue;
// cout<<i<<' '<<(i^(1<<k))<<'\n';
dp[i^(1<<k)][k+1][0] = min(dp[i][j+1][0]+p[j+1][k+1],dp[i^(1<<k)][k+1][0]);
dp[i^(1<<k)][k+1][1] = min({dp[i][j+1][0]+0*p[j+1][k+1],dp[i^(1<<k)][k+1][1],dp[i][j+1][1]+p[j+1][k+1]});
dp[i^(1<<k)][k+1][2] = min({dp[i][j+1][0]+2*p[j+1][k+1],dp[i^(1<<k)][k+1][2],dp[i][j+1][2]+p[j+1][k+1]});
dp[i^(1<<k)][k+1][3] = min({dp[i][j+1][1]+2*p[j+1][k+1],dp[i][j+1][2],dp[i^(1<<k)][k+1][3],dp[i][j+1][3]+p[j+1][k+1]});
}
// cout<<'\n';
}
}
ll ans = INF;
for(int i=1;i<=n;i++)ans = min(ans,dp[0][i][3]);
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
// cin>>t;
while(t--)
{
solve();
}
return 0;
}
状压dp写的不多,bug调半天

京公网安备 11010502036488号