Elixir Max Double Slice Sum
defmodule MaxDoubleSliceSum do
def max_double_slice_sum(a) when length(a) < 3, do: 0
def max_double_slice_sum(a) do
size = length(a)
a_map = a |> Enum.with_index() |> Map.new(fn {v, i} -> {i, v} end)
p1 = build_p1(size, a_map)
p2 = build_p2(size, a_map)
1..(size - 2)
|> Enum.map(fn i -> Map.get(p1, i) + Map.get(p2, i) end)
|> Enum.max()
end
defp build_p1(size, a_map) do
Enum.reduce(2..(size - 2)//1, %{1 => 0}, fn i, p1 ->
value = max(0, Map.get(p1, i - 1) + Map.get(a_map, i - 1))
Map.put(p1, i, value)
end)
end
defp build_p2(size, a_map) do
Enum.reduce(2..(size - 2)//1, %{size - 2 => 0}, fn i, p2 ->
key = size - i - 1
value = max(0, Map.get(p2, size - i) + Map.get(a_map, size - i))
Map.put(p2, key, value)
end)
end
end
This keeps the best sum ending on the left and starting on the right, then combines them around each middle position.