Re[5]: Помогите ускорить алгоритм
От: watchmaker  
Дата: 30.03.16 23:36
Оценка:
Здравствуйте, Кузнец, Вы писали:

К>Либо 260 сложений этому алгоритму недостаточно, либо я его попросту неверно понял. Описанный алгоритм разлагает ответ в сумму единиц и их складывает, по-моему это в первом сообщении и описано (идёт рекурсия функцией f, рекурсивный вызов обрывается лишь если второй аргумент f равен нулю, при такой ситуации значение f будет равно 1, то есть внизу рекурсии у нас только единицы).


Это сейчас у тебя рекурсия написана, а в первом сообщении написано про динамику. В динамическом программировании не нужно повторно решать уже решенные задачи. Спуск до единиц произойдёт только при первом переходе от длины 0 к длине 1. Больше они никогда в решении не возникнут.

К> как именно должен выглядеть алгоритм.

Алгоритм — как написано. Простейшая реализация — так:

Пусть V - число состояний автомата

завести два массива A[V] и B[V]
инициализировать массив A значениями 0 или 1 в зависимости от того, является ли соответствующее состояние терминальным

для i от 1 до n:
   занулить массив B
   для каждой вершины v из [1..V]:
       для каждого символа s из алфавита:
           B[g(v, s)] += A[v]
   поменять массивы A и B местами
выдать A[root]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.