Russian Dolls

マトリョーシカの性質上、DAG になる。動的計画法を使って解けた。

dp[i] := i個のマトリョーシカを使ってでできる最大のマトリョーシカ

while line = gets
n = line.chomp.to_i
break if n == 0

dolls = []
n.times do
dolls << gets.chomp.split.map(&:to_i)
end

m = gets.chomp.to_i
m.times do
dolls << gets.chomp.split.map(&:to_i)
end

dolls.sort! do |a, b|
if a[0] == b[0]
a[1] <=> b[1]
else
a[0] <=> b[0]
end
end

dp = Array.new(dolls.size + 1, 0)

for i in 1..dolls.size
for j in 1..i
if i - j == 0 || (dolls[i - 1][0] > dolls[i - j - 1][0] && dolls[i - 1][1] > dolls[i - j - 1][1])
dp[i] = [dp[i], dp[i - j] + 1].max
end
end
end

puts dp.max
end