import sequtils type Optimizer = object dims: seq[int] m: seq[seq[Natural]] s: seq[seq[Natural]] proc initOptimizer(dims: openArray[int]): Optimizer = ## Create an optimizer for the given dimensions. Optimizer(dims: @dims) proc findMatrixChainOrder(opt: var Optimizer) = ## Find the best order for matrix chain multiplication. let n = opt.dims.high opt.m = newSeqWith(n, newSeq[Natural](n)) opt.s = newSeqWith(n, newSeq[Natural](n)) for lg in 1..