m[i,i] = 0 m[i,j] = min { m[i,k] + m[k+1,j] + p[i-1]*p[k]*p[j] } i<=k## use Memoize; use List::Util 'min'; memoize 'm'; sub m { my ($i,$j) = @_; return 0 if $i == $j; return min map { m($i,$_) + m($_+1,$j) + $P[$i-1]*$P[$_]*$P[$j] } $i .. $j-1; }