N = gets.to_i S = (1 << N) DP = Array.new(S,-1) def dfs(s) if DP[s] < 0 N.times do |i| N.times do |j| if i > j && (s & 1 << i) > 0 && (s & 1 << j) > 0 ex = (1 << i) | (1 << j) like = dfs(s ^ ex) + dfs(ex) if like > DP[s] DP[s] = like end end end end end return DP[s] end unit = N.times.map{ gets.split.map(&:to_i) } N.times do |i| N.times do |j| if i > j DP[1 << i | 1 << j] = unit[i][j] end end end dfs(S-1) puts DP[S-1]