# https://yukicoder.me/submissions/1120362 を改造 h,w,k = gets.split.map(&:to_i) A = h.times.map{gets.split.map(&:to_i)} B = h.times.map{gets.split.map(&:to_i)} sum_row = Array.new(h,0) sum_col = Array.new(w,0) cost_row = Array.new(h){Array.new} cost_col = Array.new(w){Array.new} row_sorter = Array.new(w,0) h.times do |i| w.times do |j| sum_row[i] += A[i][j] row_sorter[j] = B[i][j] sum_col[j] += A[i][j] cost_col[j] << B[i][j] end row_sorter[i].sort! cost_row[i] = row_sorter[0..1] end w.times do |i| cost_col[i].sort! end # 部分問題 def solve(a,b,c,a_cost,b_cost,c_cost,k) if a_cost <= b_cost && a_cost <= c_cost # a_cost が一番小さい時 add_a = k/a_cost (a+add_a+b) * (a+add_a+c) elsif a_cost > b_cost && a_cost > c_cost # a_cost が単独で一番大きい時 b_opt = ((a+c)*c_cost - (a+b)*b_cost + k) / (2*b_cost) kouho = [0,b_opt,b_opt+1,k/b_cost] max = 0 kouho.each do |add_b| next if add_b < 0 || k/b_cost < add_b rest_k = k - add_b * b_cost add_c = rest_k/c_cost val = (a+b+add_b) * (a+c+add_c) max = val if max < val end max else # a_cost より小さい値が 1 つだけある時 (c_cost) a_opt = ((a+c)*c_cost + (a+b)*(c_cost-a_cost) + k) / (2*(a_cost-c_cost)) kouho = [0,a_opt,a_opt+1,k/a_cost] max = 0 kouho.each do |add_a| next if add_a < 0 || k/a_cost < add_a rest_k = k - add_a * a_cost add_c = rest_k/c_cost val = (a+add_a+b) * (a+add_a+c+add_c) max = val if max < val end max end end max = 0 h.times do |i| w.times do |j| a = A[i][j] a_cost = B[i][j] b = sum_row[i] - a b_cost = a_cost == cost_row[i][0] ? cost_row[i][1] : cost_row[i][0] c = sum_col[j] - a c_cost = a_cost == cost_col[j][0] ? cost_col[j][1] : cost_col[j][0] if b_cost < c_cost # b_costの方が絶対に大きくなるようにする b,c = c,b b_cost,c_cost = c_cost,b_cost end v = solve(a,b,c,a_cost,b_cost,c_cost,k) max = v if max < v end end puts max