let rand = let randGen = System.Random() fun _ -> randGen.Next 300 let [] ListSize = 100000 let k = 3 let list = Array.init ListSize rand printfn "%A" list let cache = System.Collections.Generic.Dictionary (list.Length + 2*k + 1) seq {list.Length .. list.Length + 2*k} |> Seq.iter (fun i -> cache.Add(i, (0, []))) for i in list.Length - 1 .. -1 .. 0 do let maxSum, maxList = seq {i + k .. i + 2*k} |> Seq.map (fun i -> cache.[i]) |> Seq.maxBy fst cache.Add(i, (list.[i] + maxSum, i :: maxList)) let maxSum, maxList = seq {0 .. k} |> Seq.map (fun i -> cache.[i]) |> Seq.maxBy fst printfn "%i: %A" maxSum maxList