Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Задача про хорды(динам.прогр) |
Автор: hter 11.12.2013, 16:07 |
Окружность на ней точки обозначены буквами A,B,C,D. Дается строка(порядка 200 букв) с произвольным наборов букв (количество А и B совпадает, С и D тоже совпадает). Надо найти количество способов соединить все точки непересекающимися хордами. Если А можно соединить только с B(и обратно можно B c A), С только с D(D можно с C). Я ее решил рекурсией, но не подходит из-за времени выполнения. Не понимаю как с помощью динамического программирования решить. Помогите. p.s. я python использую |
Автор: Lipetsk 13.12.2013, 13:24 |
не пойму, при чём тут динамическое программирование но если вы найдёте такое решение, отпишитесь, пожалуйста возможно, вы делаете полный перебор, а можно сократить соединять можно только те точки A и B, между которыми, двигаясь по окружности, количество точек A совпадает с количеством точек B, и количество C совпадает с количеством D |
Автор: Фантом 13.12.2013, 13:40 |
Может быть, проще переписать уже имеющееся решение на чем-то другом? У Python'а, при всех его достоинствах, скорость выполнения крайне низкая, даже замена на другой интерпретируемый язык может оказаться достаточной. |
Автор: Фантом 13.12.2013, 20:13 | ||
В идале - на чистом C. В реальности лучше сначала прикинуть, насколько надо увеличить быстродействие. |
Автор: OpenGL 16.12.2013, 11:54 |
А как решали? Надо так - проводим хорду, далее считаем ответ для левой и правой половин, перемножаем. И, разумеется, ответы сохраняем, чтобы по нескольку раз их не считать. Такой алгоритм и с такими ограничениями, как мне кажется, и на питоне будет быстро работать. |
Автор: Lipetsk 16.12.2013, 15:39 |
hter, а есть последовательности, на которых можно потестироваться, чтоб заведомо было решение |
Автор: hter 16.12.2013, 23:00 | ||||
Одних первых хорд может быть э так вариантов 100. Я решал по кругу..от первого и перебрал какие подходят Добавлено через 4 минуты и 13 секунд
Так можно и придумать: CACBADBDCDAB - 2 варианта АBABAB - 5 вариантов АBABСDAB - 1 вариант |
Автор: OpenGL 17.12.2013, 11:17 |
Ну и что? Всего состояний в динамике 100 * 199, а каждое большее состояние просчитывается за O(n) через меньшие (уже подсчитанные и сохраненные), а значит общая сложность - куб. Тормозить в данной реализации может только сам питон ![]() |
Автор: hter 17.12.2013, 14:43 |
Вот что значит сохраненные? Добавлено через 59 секунд Может мой нубский код скинуть? Добавлено через 4 минуты и 22 секунды ну должно же быть решение не за O(n^3) а там за O(nlogn) |
Автор: OpenGL 17.12.2013, 15:22 | ||
Почему должно? ![]() Что-то типа псевдокода c синтаксисом C++ ![]()
Это - вполне себе динамика, только записанная в рекурсивной форме. Для каждой пары входных параметров функции, если уже считали ответ, возвращаем его сразу. |
Автор: hter 17.12.2013, 21:07 | ||||
Спасибо, попробую реализовать.
ну как то хочется, что б было)) Добавлено через 28 секунд жаль си не знаю |
Автор: OpenGL 18.12.2013, 05:39 |
Что непонятного в этом псевдокоде? Убрать int и скобки {} - почти питон будет ![]() |
Автор: Lipetsk 18.12.2013, 08:42 | ||
так вроде должно быть 200 букв ![]() просто случайно сгенерированная последовательность из 200 у меня имеет не более 5 возможных (с учётом правила из моего первого комментария) хорд из одного узла, а для некоторых узлов ни одного |
Автор: OpenGL 18.12.2013, 08:54 | ||
На случайных ответ чаще всего 0 будет ![]() Тут, кстати, 5 вариантов. |
Автор: hter 19.12.2013, 14:09 |
ABACDBACDBBAABDBACCDABADDCBADCCCDDCBABAABADABCBBAABCABABDBAABAABBBABDCABABDCABADCBABBAAABABADCBBBDAB ABABABBACCDCDCDABDABDCCDCABAABADABBAABAAAABADCBBBABAABBBDCCCCDCDDCCDCABDBADCBCDCDAABBAABDBABCDCBCA BABABDCDCDABACCDDCDBBACDADCDABCDBCCDCDDABCDABBABACDDBCDABACAADCBBABACD Добавлено @ 14:18 ответ = число способов mod 1000000 |
Автор: hter 19.12.2013, 14:30 | ||
только ноль и получается же |
Автор: OpenGL 20.12.2013, 07:00 |
Ищите ошибку в вашей реализации. Алгоритм верный. |