Цитата:
Не забудьте послать результаты в OEIS.
Уже послал. Общался с одним физиком из франции, он год назад собирался что-то такое считать, но, видимо, не успел.
Цитата:
Задача оказалась не совсем подходящей для конкурса, так как существенно лучшее решение, чем приведенно вами на хабре, придумать очень тяжело (тем более в условиях конкурса).
Ну так я и говорю, "кто первым встал, того и тапки" : ). Конкурс научный, поэтому сюда подходит любая нерешённая до этого задача. Остальные "задачи" я называю словом "упражнения". Немного пафосно, но что поделать, если другие задачи уже кто-то решил... Когда-нибудь, когда будет много денег, я буду устраивать научные конкурсы на год и больше. Задач немерено, денег - только то, что удалось сэкономить с бомжовой зарплаты преподавателя. Сейчас школьники больше на карманные расходы получают : )
Цитата:
1) использовать диагональные разрезы по вершинам. К сожалению, количество таких допустимых разрезов растёт пропорционально
.
Это я делал, не удалось довести идею до такого состояния, чтобы хоть немного работало. Действительно, слишком быстро растет число состояний.
Цитата:
2) построить автомат с магазинной памятью, который бы "строил" разрезы пошагово (змейкой - первый разрез справо-налево, затем слева-направо и т.д.) Точнее говоря, этот автомат распознавал бы образуют ли данные последовательные разрезы (пред)гамильтонов цикл или нет. В чистом виде количество состояний у такого автомата невелико (на вскидку десяток-два), хотя для нахождения количества его успешных вычислений (соответствующие различным гамильтоновым циклам), пришлось бы также включать в описание состояния содержимое стека. Не знаю, может ли этот подход дать лучший алгоритм.
Не понял идею, но я верю только тому, что может дать конкретную цифру. Вот есть ответ для n=10, если кто-то претендует на хороший алгоритм, он должен сказать, что может данную цифру повторить. Может это и лучше, но надо, чтобы кто-то написал и проверил. Я этой задачей в ближайший год больше заниматься не буду. У меня на очереди еще полдюжины таких.
Цитата:
использование meet-in-the-middle. По сути любой из описанных алгоритмов (включая ваш) для решения этой задачи может быть ускорен с помощью meet-in-the-middle. Нужно всего лишь вычислить количество половинок (пред)гамильтоновых циклов, а затем замкнуть все подходящие пары половинок.
Этим методом пользовался участник alexBlack. Я его тоже хотел применить, но вовремя одумался. Оптимизация по скорости всего в два раза, не заслуживает того, чтобы её применять, так как перехода от n=10 к n=11 она не даст. Надо применять только такие оптимизации, которые экономят либо память, либо память и время одновременно. Например, учет того, что симметричные разрезы можно хранить как один. То есть, (())() и ()(()) - это одно и тоже. Уже почти вдвое по памяти и по времени. В труднорешаемых задачах все, что не даёт разумного по времени перехода от n к n+1 за оптимизацию не считается. Если ускорять, то надо раз в 20.