let k = 3
let list = [|7; 18; 6; 10; 12; 128|]
printfn "%A" list
let mutable cache = Map.empty
for i in list.Length - 1 .. -1 .. 0 do
if i >= list.Length - k - 1 then
cache <- cache.Add(i, (list.[i], [i]))
else
let mutable maxSum = System.Int32.MinValue
let mutable maxList = List.empty
for j in k .. min (2*k) (list.Length - i - 1) do
let tSum, tList = cache.[i + j]
if tSum > maxSum then
maxSum <- tSum
maxList <- tList
cache <- cache.Add(i, (list.[i] + maxSum, i :: maxList))
let mutable maxSum = System.Int32.MinValue
let mutable maxList = List.empty
for j in 0 .. k do
let tSum, tList = cache.[j]
if tSum > maxSum then
maxSum <- tSum
maxList <- tList
printfn "%i: %A" maxSum maxList
bGV0IGsgPSAzCmxldCBsaXN0ID0gW3w3OyAxODsgNjsgMTA7IDEyOyAxMjh8XSAKcHJpbnRmbiAiJUEiIGxpc3QKCmxldCBtdXRhYmxlIGNhY2hlID0gTWFwLmVtcHR5Cgpmb3IgaSBpbiBsaXN0Lkxlbmd0aCAtIDEgLi4gLTEgLi4gMCBkbwogICAgaWYgaSA+PSBsaXN0Lkxlbmd0aCAtIGsgLSAxIHRoZW4KICAgICAgICBjYWNoZSA8LSBjYWNoZS5BZGQoaSwgKGxpc3QuW2ldLCBbaV0pKQogICAgZWxzZQogICAgICAgIGxldCBtdXRhYmxlIG1heFN1bSA9IFN5c3RlbS5JbnQzMi5NaW5WYWx1ZQogICAgICAgIGxldCBtdXRhYmxlIG1heExpc3QgPSBMaXN0LmVtcHR5CiAgICAgICAgZm9yIGogaW4gayAuLiBtaW4gKDIqaykgKGxpc3QuTGVuZ3RoIC0gaSAtIDEpIGRvCiAgICAgICAgICAgIGxldCB0U3VtLCB0TGlzdCA9IGNhY2hlLltpICsgal0KICAgICAgICAgICAgaWYgdFN1bSA+IG1heFN1bSB0aGVuCiAgICAgICAgICAgICAgICBtYXhTdW0gPC0gdFN1bQogICAgICAgICAgICAgICAgbWF4TGlzdCA8LSB0TGlzdAogICAgICAgIGNhY2hlIDwtIGNhY2hlLkFkZChpLCAobGlzdC5baV0gKyBtYXhTdW0sIGkgOjogbWF4TGlzdCkpCgpsZXQgbXV0YWJsZSBtYXhTdW0gPSBTeXN0ZW0uSW50MzIuTWluVmFsdWUKbGV0IG11dGFibGUgbWF4TGlzdCA9IExpc3QuZW1wdHkKZm9yIGogaW4gMCAuLiBrIGRvCiAgICBsZXQgdFN1bSwgdExpc3QgPSBjYWNoZS5bal0KICAgIGlmIHRTdW0gPiBtYXhTdW0gdGhlbgogICAgICAgIG1heFN1bSA8LSB0U3VtCiAgICAgICAgbWF4TGlzdCA8LSB0TGlzdApwcmludGZuICIlaTogJUEiIG1heFN1bSBtYXhMaXN0