да, всё так.
ну под "динамическим" я имел в виду что я буду решать это динамикой снизу вверху, где при выборе шаблона в узле мы перебираем все шаблоны и ищем минимум суммы cost(T) + cost(mem[leftNode]) + cost(mem[rightNode])
Меня просто смущает тот момент, что у нас по сути может получится ориентированный граф. А в каком порядке надо его обходить? просто от констант bfs'ом?
У Вас задание такое — использовать динамическое программирование? Если нет, то я бы на время забыл об этом подходе. Используйте простейший жадный алгоритм с обходом сверху вниз и выбором наибольшего сопоставления.
Очевидно, что если циклических конструкций нет, то максимум, что грозит это DAG. А если Вы в своем компиляторе не производили CSE, то и беспокоиться не о чем — это обычное дерево или, точнее говоря, лес.