let egg_drop eggs floors =
  let dp = Array.init (eggs + 1) (fun _ -> Array.make (floors + 1) 0) in
  for f = 1 to floors do
    dp.(1).(f) <- f
  done;
  for e = 1 to eggs do
    dp.(e).(0) <- 0;
    dp.(e).(1) <- 1
  done;
  for e = 2 to eggs do
    for f = 2 to floors do
      let best = ref 100000000 in
      for k = 1 to f do
        let bre = dp.(e - 1).(k - 1) in
        let sur = dp.(e).(f - k) in
        let cand = 1 + (if bre > sur then bre else sur) in
        if cand < !best then best := cand
      done;
      dp.(e).(f) <- !best
    done
  done;
  dp.(eggs).(floors)

;;

egg_drop 2 36
