n, m = gets.split.map(&:to_i) ws = gets.split.map(&:to_i) memo = Array.new(2){ Array.new(2){ Array.new(m+1, -Float::INFINITY) } } memo[0][0][m] = 0 memo[1][1][m-1] = 0 0.upto(n-2){|i| 0.upto(m){|j| memo[0][0][j] = memo[0][0][j] > memo[0][1][j] ? memo[0][0][j] : memo[0][1][j] memo[0][1][j] = memo[0][0][j+1] > memo[0][1][j+1] + ws[i] ? memo[0][0][j+1] : memo[0][1][j+1] + ws[i] if j < m memo[1][0][j] = memo[1][0][j] > memo[1][1][j] ? memo[1][0][j] : memo[1][1][j] memo[1][1][j] = memo[1][0][j+1] > memo[1][1][j+1] + ws[i] ? memo[1][0][j+1] : memo[1][1][j+1] + ws[i] if j < m } } memo[1][1][0] += ws.last puts [memo[0][0][0], memo[0][1][0], memo[1][0][0], memo[1][1][0]].max