![]() |
|
![]() ![]() ![]() |
|
hter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.11.2013 Репутация: нет Всего: нет |
Окружность на ней точки обозначены буквами A,B,C,D. Дается строка(порядка 200 букв) с произвольным наборов букв (количество А и B совпадает, С и D тоже совпадает). Надо найти количество способов соединить все точки непересекающимися хордами. Если А можно соединить только с B(и обратно можно B c A), С только с D(D можно с C).
Я ее решил рекурсией, но не подходит из-за времени выполнения. Не понимаю как с помощью динамического программирования решить. Помогите. p.s. я python использую Это сообщение отредактировал(а) hter - 11.12.2013, 16:08 |
|||
|
||||
Lipetsk |
|
|||
![]() в форме ;) ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 28.1.2009 Где: Липецк Репутация: 2 Всего: 5 |
не пойму, при чём тут динамическое программирование
но если вы найдёте такое решение, отпишитесь, пожалуйста возможно, вы делаете полный перебор, а можно сократить соединять можно только те точки A и B, между которыми, двигаясь по окружности, количество точек A совпадает с количеством точек B, и количество C совпадает с количеством D |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Может быть, проще переписать уже имеющееся решение на чем-то другом? У Python'а, при всех его достоинствах, скорость выполнения крайне низкая, даже замена на другой интерпретируемый язык может оказаться достаточной. |
|||
|
||||
hter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.11.2013 Репутация: нет Всего: нет |
Отпишусь, но как то я далек от этого. Я не все перебираю, а только которые остались. Может быть, но O(n^3). Если б в строке было 10-20 символов то не проблема, а в строке их 200 и более. на чем попробовать советуете? Это сообщение отредактировал(а) hter - 13.12.2013, 17:55 |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
||||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
А как решали? Надо так - проводим хорду, далее считаем ответ для левой и правой половин, перемножаем. И, разумеется, ответы сохраняем, чтобы по нескольку раз их не считать. Такой алгоритм и с такими ограничениями, как мне кажется, и на питоне будет быстро работать.
|
|||
|
||||
Lipetsk |
|
|||
![]() в форме ;) ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 28.1.2009 Где: Липецк Репутация: 2 Всего: 5 |
hter, а есть последовательности, на которых можно потестироваться, чтоб заведомо было решение
|
|||
|
||||
hter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.11.2013 Репутация: нет Всего: нет |
Одних первых хорд может быть э так вариантов 100. Я решал по кругу..от первого и перебрал какие подходят Добавлено через 4 минуты и 13 секунд
Так можно и придумать: CACBADBDCDAB - 2 варианта АBABAB - 5 вариантов АBABСDAB - 1 вариант |
|||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
Ну и что? Всего состояний в динамике 100 * 199, а каждое большее состояние просчитывается за O(n) через меньшие (уже подсчитанные и сохраненные), а значит общая сложность - куб. Тормозить в данной реализации может только сам питон ![]() |
|||
|
||||
hter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.11.2013 Репутация: нет Всего: нет |
||||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
Почему должно? ![]() Что-то типа псевдокода c синтаксисом C++ ![]()
Это - вполне себе динамика, только записанная в рекурсивной форме. Для каждой пары входных параметров функции, если уже считали ответ, возвращаем его сразу. |
|||
|
||||
hter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.11.2013 Репутация: нет Всего: нет |
Спасибо, попробую реализовать.
ну как то хочется, что б было)) Добавлено через 28 секунд жаль си не знаю |
|||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
||||
|
||||
Lipetsk |
|
|||
![]() в форме ;) ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 28.1.2009 Где: Липецк Репутация: 2 Всего: 5 |
так вроде должно быть 200 букв ![]() просто случайно сгенерированная последовательность из 200 у меня имеет не более 5 возможных (с учётом правила из моего первого комментария) хорд из одного узла, а для некоторых узлов ни одного |
|||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
На случайных ответ чаще всего 0 будет ![]() Тут, кстати, 5 вариантов. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |