ocaml: phase 5.1 house_robber.ml baseline (max non-adjacent sum = 22)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 26s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 26s
Classic House Robber linear DP:
dp[i] = max(dp[i-2] + houses[i], dp[i-1])
For [2; 7; 9; 3; 1; 5; 8; 6]:
dp = [2, 7, 11, 11, 12, 16, 20, 22]
max sum = 22
Optimal pick is {indices 0, 2, 5, 7}: 2 + 9 + 5 + 6 = 22 (all
non-adjacent).
Tests linear DP with early-return edge cases for n=0 and n=1,
inline-if rhs for max-of-two, dual look-back into dp[i-2] and
dp[i-1].
189 baseline programs total.
This commit is contained in:
@@ -78,6 +78,7 @@
|
||||
"hamming.ml": 4,
|
||||
"hanoi.ml": 1023,
|
||||
"hist.ml": 75,
|
||||
"house_robber.ml": 22,
|
||||
"histogram_area.ml": 10,
|
||||
"huffman.ml": 224,
|
||||
"int_sqrt.ml": 1027,
|
||||
|
||||
19
lib/ocaml/baseline/house_robber.ml
Normal file
19
lib/ocaml/baseline/house_robber.ml
Normal file
@@ -0,0 +1,19 @@
|
||||
let rob houses =
|
||||
let n = Array.length houses in
|
||||
if n = 0 then 0
|
||||
else if n = 1 then houses.(0)
|
||||
else begin
|
||||
let dp = Array.make n 0 in
|
||||
dp.(0) <- houses.(0);
|
||||
dp.(1) <- if houses.(0) > houses.(1) then houses.(0) else houses.(1);
|
||||
for i = 2 to n - 1 do
|
||||
let take = dp.(i - 2) + houses.(i) in
|
||||
let skip = dp.(i - 1) in
|
||||
dp.(i) <- if take > skip then take else skip
|
||||
done;
|
||||
dp.(n - 1)
|
||||
end
|
||||
|
||||
;;
|
||||
|
||||
rob [| 2; 7; 9; 3; 1; 5; 8; 6 |]
|
||||
Reference in New Issue
Block a user