Всем добрый вечер! Понадобилось решить следующую задачу.
Пусть мы имеем машину, которая принимает на вход буквы A, B и C. После каждой принятой буквы машина смотрит на последние три буквы (включая эту) и возвращает:
- 0, если у нас либо все буквы A, либо все буквы B, либо все все буквы C
- 2, если содержатся все три буквы A, B, C
- 1 во всех остальных случаях
Пока у нас меньше трех символов прошло через машину, то правила аналогичны (для одного символа всегда работает первое правило, а для двух - либо первое, либо третье).
Собственно, дается заранее полностью известная последовательность символов из алфавита {A,B,C} и две машины, которые работают вышеописанным образом.
Задача состоит в том, чтобы распределять каждый следующий символ между двумя данными машинами, чтобы сумма всех выводов из первой и второй машины была максимальной.
Собственно, брутфорс-перебор довольно очевиден: делать две пары копий машин, в первой паре символ подать на первую машину, во второй паре - на вторую машину, и запустить такой же алгоритм для каждой пары машин для новой последовательности символов (та же, но без первого символа) и выделить ту пару, где сумма будет больше. Но это, во-первых, крайне медленно (очевидно,
), во-вторых, много памяти, рекурсия и вообще некрасиво.
Попытки применить принципы жадного алгоритма были довольно унылы, т.к. в примитивном варианте алгоритма будет всегда выгоднее все вставлять в одну машину, а если распределять еще по длине (если одинаковая стоимость, но в одной из машин состояний меньше, то распределить туда) все равно не все случаи покрывает: бывают случаи, когда надо принять невыгодное на данном этапе решение, которое станет выгодно позже.
Может ли кто-то подкинуть мысль о чем стоит задуматься, ну, или что почитать, если есть подобного рода классы задач? Заранее всем спасибо.