题目大意:金字塔形的杯子排列,由最上面的杯子开始灌水,水在灌满杯子后,溢出的水会均匀流到脚下的两个杯子中。给定灌水量和由i,j 确定的杯子的位置,求这个杯子的灌水量。
题目分析:给定了杯子的坐标,只要由上到下依次求出和这个杯子有关的杯子的灌水量即可,放在边缘的杯子只有一个水源,而放在里面的杯子有两个水源。
AC code:(Ruby)
def champagne_tower(poured, query_row, query_glass)
poured, ri, rj = [poured.to_f, query_row, query_glass]
cups = Array.new(ri + 1){Array.new(rj + 1, 0.0)}
diff = ri - rj
max = ->(a, b){a > b ? a : b}
min = ->(a, b){a < b ? a : b}
get_from_upper = ->(p){max.(p - 1, 0) / 2}
(0..ri).each {|i|
if i <= diff then 0..min.(i, rj) else (i - diff)..min.(i, rj)
end.each {|j|
cups[i][j] =
case
when i == 0 && j == 0
poured
when j == 0
get_from_upper.(cups[i - 1][j])
when j == i
get_from_upper.(cups[i - 1][j - 1])
else
get_from_upper.(cups[i - 1][j - 1]) + get_from_upper.(cups[i - 1][j])
end
}
}
min.(cups[ri][rj], 1.0)
end