Проблем с реда на умножение на матрица
Проблемът за реда на умножение на матрицие класически проблем за динамично програмиране, в който последователност от матрици A 1 , A 2 , … , A n ,A_,\dots ,A_> и се изисква да се минимизира броят на скаларните операции за изчисляване на техния продукт. Приема се, че матриците са съвместими по отношение на умножението на матрица (тоест броят на колоните A i − 1>gt; е същият като броя на редовете A i>gt; на матрицата).
Съдържание
Матричният продукт е асоциативна операция, която приема като вход две матрициk×mиm×nи връща матрица с размерk×n, изразходвайкиkmnоперации за умножение [1] .
Нека анализираме 2 начина за решаване на проблема, за да покажем колко полезно е динамичното програмиране в този случай.
Изброяване на всички опции за поставяне на скоби
Намаляване на задача до подзадачи
Рекурсивно решение
Динамично програмиране
Ще съхраняваме резултатите от изчисленията за подзадачи в двумерен масив m, за да избегнем преизчисляване за вече изчислени подзадачи. След изчисленията отговорът ще бъде в m[1,n](Колко умножения са необходими за поредица от матрици от 1 до n - т.е. отговорът на проблема). Сложността на алгоритъма ще бъде O ( n 3 ) \right)> , тъй като имаме ( n 2 ) > избори i, j : 1 ≤ i ≤ j ≤ n и O ( N ) точки на разделяне за всеки избор. Подробностите ще станат ясни от изпълнението.
В основния метод - пример от началото на статията. Ако се стартира, ще изведе 7500, както се очаква.
Дадени са само методи, които директно извършват необходимите изчисления.
dataStore - клас обект, който съхранява всички данни
Функционални части на кода:
Този проблем се свежда до проблема с оптимизирането на безплатнотоенергия на РНК молекулата в биоинформатиката (тук чифт скоби в реда на РНК мономерите определя тяхното сдвояване). Такова динамично програмиране се реализира в алгоритмите на Nussinov или Zucker.