(備忘録)問題解決のための「アルゴリズム数学」〜 6

問題

atcoder.jp

自分の回答

Rangeの(0...N)の部分を最初(0..N)としていたので最後のN部分(nil)が含まれていることが分からず沼りました。 また書籍見ながらなので回答の出し方はなんとなく分かるのですが、この辺りは今後自分で考えながら出せるようになりたいですね。

N = gets.to_i
h = gets.split.map(&:to_i)
dp = Array.new(N)
(0...N).each do |i|
  if i == 0
    dp[0] = 0
  elsif i == 1
    dp[1] = (h[1] - h[0]).abs
  else
    v1 = dp[i-1] + (h[i] - h[i-1]).abs
    v2 = dp[i-2] + (h[i] - h[i-2]).abs
    dp[i] = [v1, v2].min
  end
end
puts dp[N-1]