const maxN = 155; var v, u, cross0: array[0 .. pred(maxN), 0 .. pred(maxN)] of integer; str0, col0: array[0 .. pred(maxN)] of integer; strround, colround: array[0 .. pred(maxN)] of integer; usestr: array[0 .. pred(maxN)] of integer; n: integer; const vmax: integer = 0; procedure read; var a, i, j: integer; begin readln(n); for i := 0 to pred(n) do col0[i] := 0; for i := 0 to pred(n) do for j := 0 to pred(n) do begin readln(v[i][j]); inc(col0[j], v[i][j]); end; for i := 0 to pred(n) do for j := 0 to pred(n) do v[i][j] := col0[j] - v[i][j]; end; procedure privod; var i, j, umin: integer; begin for i := 0 to pred(n) do for j := 0 to pred(n) do if vmax > v[i][j] then vmax := vmax else vmax := v[i][j]; for i := 0 to pred(n) do for j := 0 to pred(n) do u[i][j] := v[i][j]; for i := 0 to pred(n) do begin umin := u[i][0]; for j := 1 to pred(n) do if umin < u[i][j] then umin := umin else umin := u[i][j]; for j := 0 to pred(n) do dec(u[i][j], umin); end; for j := 0 to pred(n) do begin umin := u[0][j]; for i := 1 to pred(n) do if umin < u[i][j] then umin := umin else umin := u[i][j]; for i := 0 to pred(n) do dec(u[i][j], umin); end; end; procedure mark0; var i, j: integer; begin for i := 0 to pred(n) do for j := 0 to pred(n) do cross0[i][j] := 0; for i := 0 to pred(n) do begin str0[i] := 0; col0[i] := 0; end; for i := 0 to pred(n) do for j := 0 to pred(n) do if u[i][j] = 0 then if (str0[i] = 0) and (col0[j] = 0) then begin cross0[i][j] := 1; str0[i] := 1; col0[j] := 1; end else cross0[i][j] := -1; end; function findcouple(i: integer): integer; var i1, j: integer; begin j := 0; while cross0[i][j] <> 1 do inc(j); for i1 := 0 to pred(n) do if (cross0[i1][j] = -1) and (usestr[i1] = 0) then begin if str0[i1] = 0 then begin str0[i1] := 1; cross0[i1][j] := 1; cross0[i][j] := -1; findcouple := 1; exit end else begin usestr[i1] := 1; if findcouple(i1) = 1 then begin cross0[i1][j] := 1; cross0[i][j] := -1; findcouple := 1; exit end; end; end; findcouple := 0; end; function upcouple: integer; var i, j: integer; begin for i := 0 to pred(n) do usestr[i] := 0; for j := 0 to pred(n) do if col0[j] = 0 then for i := 0 to pred(n) do if cross0[i][j] = -1 then begin usestr[i] := 1; if findcouple(i) = 1 then begin col0[j] := 1; cross0[i][j] := 1; upcouple := 1; exit end else usestr[i] := 0; end; upcouple := 0; end; procedure maxcouple; begin while upcouple = 1 do end; function fin: integer; var i: integer; begin for i := 0 to pred(n) do if str0[i] = 0 then begin fin := 0; exit end; fin := 1; end; procedure minsupport; var i, j, b: integer; begin for i := 0 to pred(n) do begin strround[i] := 0; colround[i] := 0; end; for i := 0 to pred(n) do strround[i] := 1 - str0[i]; b := 1; while b <> 0 do begin b := 0; for i := 0 to pred(n) do if strround[i] <> 0 then for j := 0 to pred(n) do if cross0[i][j] = -1 then colround[j] := 1; for j := 0 to pred(n) do if colround[j] <> 0 then for i := 0 to pred(n) do if (cross0[i][j] = 1) and (strround[i] = 0) then begin b := 1; strround[i] := 1; end; end; end; procedure rotate0; var i, j, min: integer; begin min := vmax; for i := 0 to pred(n) do if strround[i] <> 0 then for j :=0 to pred(n) do if colround[j] = 0 then if min > u[i][j] then min := u[i][j]; for i := 0 to pred(n) do if strround[i] = 0 then for j := 0 to pred(n) do inc(u[i][j], min); for j := 0 to pred(n) do if colround[j] = 0 then for i := 0 to pred(n) do dec(u[i][j], min); end; procedure answer; var i, j, sum: integer; begin sum := 0; for i := 0 to pred(n) do begin for j := 0 to pred(n) do if cross0[i][j] = 1 then begin inc(sum, v[i][j]); break; end; end; writeln(sum); end; procedure method; begin privod; while true do begin mark0; maxcouple; if fin <> 0 then break; minsupport; rotate0; end; answer; end; begin read; method; end.