N = gets.to_i S = gets.split.map(&:to_i) MP = S.max dp = Array.new(N + 2) { Array.new(MP + 1, Float::INFINITY) } dp[0][0] = 1 0.upto(MP) do |power| 0.upto(N) do |level| power_limit = S[level] if level - 1 >= 0 && dp[level][power] > dp[level - 1][power] + 1 dp[level][power] = dp[level - 1][power] + 1 end 0.upto(MP) do |b_power| n_power = power + b_power + 1 n_power = power_limit if n_power > power_limit if dp[level][n_power] > dp[level][power] + dp[level][b_power] dp[level][n_power] = dp[level][power] + dp[level][b_power] end end end end puts dp[N].join(' ')