Порядок умножения матриц
Где ставить скобки: порядок умножений меняет стоимость в разы.
1function matrixChainOrder(dims: number[]): number {2 const n = dims.length - 1 // число матриц3 // d[i][j] = минимальная стоимость Ai × ... × Aj4 const d: number[][] = Array.from({ length: n + 1 }, () =>5 new Array(n + 1).fill(0))6 7 for (let len = 2; len <= n; len++) {8 for (let i = 1; i + len - 1 <= n; i++) {9 const j = i + len - 110 d[i][j] = Infinity11 for (let k = i; k < j; k++) {12 // разрез k: (Ai..Ak)(Ak+1..Aj)13 const cost = d[i][k]! + d[k + 1][j]! +14 dims[i - 1]! * dims[k]! * dims[j]!15 if (cost < d[i][j]!) d[i][j] = cost16 }17 }18 }19 20 return d[1][n]!21}22// (A1×A2)×A3 = 1500+3000 = 4500; A1×(A2×A3) = 9000+2700 = 11700Проблема
Где ставить скобки: порядок умножений меняет стоимость в разы.
Что вы видите
d[i][j] — оптимум для отрезка; перебор разрезов k.
Как это работает
Интервальная DP: короткие отрезки собираются в длинные. A1×(A2×A3) против (A1×A2)×A3 — в примере в 2.6 раза разница.
Пошаговый разбор
- 01
Диагональ
len = 2.
- 02
Разрезы
k = i..j−1.
- 03
Оптимум
Минимум по k.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
СУБД
Join-порядок.
Тензоры
Порядок свёрток.
CAS
Символьная алгебра.
Связанные алгоритмы
«Скобки решают всё»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.