(備忘録)AtCoderをやって8 (Candies)
問題
2×N のマス目があります。上から i 行目、左から j 列目 (1≤i≤2, 1≤j≤N) のマスをマス (i,j) と表すことにします。
あなたははじめ、左上のマス (1,1) にいます。 あなたは、右方向または下方向への移動を繰り返し、右下のマス (2,N) に移動しようとしています。
マス (i,j) には A i,j個のアメが置かれています。 あなたは移動中に通ったマスに置いてあるアメをすべて回収します。 左上および右下のマスにもアメが置かれており、あなたはこれらのマスに置かれているアメも回収します。
移動方法をうまく選んだとき、最大で何個のアメを回収できるでしょうか。
自分の回答(不正解)
A[0] と B[-1]は必ず通るのでそこの個数は足して、あとはAの配列とBの配列の大きい方をtotalに足せば良いのか?と思いましたが、これだとパターンにマッチしないですね。
N = gets.chomp.to_i A = gets.split.map(&:to_i) B = gets.split.map(&:to_i) total = [A[0] + B[-1]] A.delete_at(0) B.delete_at(-1) if A.sum > B.sum total << A.sum else tatal << B.sum end puts total.sum
他の方の回答
一つの配列にそれぞれの配列を格納し、resultの別の配列を用意し、それをn.timesでa[0],a[1]の配列一つずつパターンを検証していく そしてmaxで最大値を出力。 timesのブロックパラメーターが1から始まるのかと勘違いしていたが、0から始まるんですね。勉強になりました。
n = gets.to_i a = [] 2.times { a << gets.chomp.split(' ').map(&:to_i) } result = [] n.times { |i| result << a[0][0..i].sum + a[1][i..n].sum } puts result.max