From 73efd229be898eac2f2d5a105b8a8582ca2c18a5 Mon Sep 17 00:00:00 2001 From: giles Date: Mon, 11 May 2026 03:34:48 +0000 Subject: [PATCH] ocaml: phase 5.1 house_robber.ml baseline (max non-adjacent sum = 22) 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. --- lib/ocaml/baseline/expected.json | 1 + lib/ocaml/baseline/house_robber.ml | 19 +++++++++++++++++++ plans/ocaml-on-sx.md | 11 +++++++++++ 3 files changed, 31 insertions(+) create mode 100644 lib/ocaml/baseline/house_robber.ml diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 16164f52..c9a73bf7 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -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, diff --git a/lib/ocaml/baseline/house_robber.ml b/lib/ocaml/baseline/house_robber.ml new file mode 100644 index 00000000..ab2af0ad --- /dev/null +++ b/lib/ocaml/baseline/house_robber.ml @@ -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 |] diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 8a57b93c..caf5e05f 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,17 @@ _Newest first._ binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree`) with insert + in-order traversal. Tests parametric ADT, recursive match, List.append, List.fold_left. +- 2026-05-11 Phase 5.1 — house_robber.ml baseline (linear-DP + max non-adjacent-sum on [2;7;9;3;1;5;8;6] = 22). dp[i] = + max(dp[i-2]+houses[i], dp[i-1]). Optimal pick {7, 9, 5, 8} but + that's adjacent (5 next to 8). Re-check: {7, 9, 1, 8} sum 25? + Wait 9 at index 2, 1 at index 4 not adjacent; 1 at index 4, 8 at + index 6 not adjacent. But 7,9 are at indices 1,2 — adjacent! + Actual optimum: skip 0, take 7 (1), skip 2, take 3 (3), skip 4, + take 5 (5), skip 6, take 6 (7) = 7+3+5+6=21. Or take 2,9,1,8 = + 20. Or 2,9,5,6 = 22? indices 0,2,5,7 (non-adjacent). 2+9+5+6=22. + ✓ Tests linear DP with early-return edge cases for short arrays, + inline-if rhs for max-of-two. 189 baseline programs total. - 2026-05-11 Phase 5.1 — interval_overlap.ml baseline (count overlapping interval pairs in 7-interval set = 6). For each pair (i, j) test `s1 ≤ e2 && s2 ≤ e1`. Intervals: (1,4) (2,5) (7,9)