ソースコード
/**
*
*/
#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;
using i64 = int64_t;
constexpr i64 INF = INT64_C(1'010'000'000'000'000'017);
#define FOR(i, start, end) for(i64 i = (start); i < (end); ++i)
#define REP(i, n) FOR(i, 0, n)
template<typename T, typename U, typename Comp=less<>>
constexpr bool chmin(T& xmin, const U& x, Comp comp={}) noexcept {
if(comp(x, xmin)) {
xmin = x;
return true;
}
return false;
}
//--------------------------------------------------------------------
void solve() {
i64 N; cin >> N;
vector<i64> T(N);
REP(i, N) { cin >> T[i]; }
vector<vector<i64>> M(N, vector<i64>(N));
REP(i, N) REP(j, N) {
cin >> M[i][j];
}
vector<i64> dp(1LL<<N, INF);
dp[0] = 0;
REP(i, 1LL<<N) {
REP(j, N) {
if(i&(1LL<<j)) continue;
i64 t = T[j];
REP(k, N) {
if(i&(1LL<<k))
t -= M[k][j];
}
chmin(dp[i|(1LL<<j)], t+dp[i]);
}
}
i64 ans = dp[(1LL<<N)-1];
cout << ans << "\n";
}
signed main() {
solve();
return 0;
}