Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача про хорды(динам.прогр) 
:(
    Опции темы
hter
Дата 11.12.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Lipetsk
  Дата 13.12.2013, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



не пойму, при чём тут динамическое программирование
но если вы найдёте такое решение, отпишитесь, пожалуйста

возможно, вы делаете полный перебор, а можно сократить
соединять можно только те точки A и B, между которыми, двигаясь по окружности, количество точек A совпадает с количеством точек B, и количество C совпадает с количеством D
PM   Вверх
Фантом
Дата 13.12.2013, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(hter @  11.12.2013,  17:07 Найти цитируемый пост)

Я ее решил рекурсией, но не подходит из-за времени выполнения. 


Цитата(hter @  11.12.2013,  17:07 Найти цитируемый пост)

p.s. я python использую

Может быть, проще переписать уже имеющееся решение на чем-то другом? У Python'а, при всех его достоинствах, скорость выполнения крайне низкая, даже замена на другой интерпретируемый язык может оказаться достаточной.
PM   Вверх
hter
Дата 13.12.2013, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.11.2013

Репутация: нет
Всего: нет




Цитата(Lipetsk @  13.12.2013,  13:24 Найти цитируемый пост)
не пойму, при чём тут динамическое программирование
но если вы найдёте такое решение, отпишитесь, пожалуйста

возможно, вы делаете полный перебор, а можно сократить
соединять можно только те точки A и B, между которыми, двигаясь по окружности, количество точек A совпадает с количеством точек B, и количество C совпадает с количеством D 


Отпишусь, но как то я далек от этого.
Я не все перебираю, а только которые остались.


Цитата(Фантом @  13.12.2013,  13:40 Найти цитируемый пост)
Может быть, проще переписать уже имеющееся решение на чем-то другом? У Python'а, при всех его достоинствах, скорость выполнения крайне низкая, даже замена на другой интерпретируемый язык может оказаться достаточной. 


Может быть, но O(n^3). Если б в строке было 10-20 символов то не проблема, а в строке их 200 и более. 
на чем попробовать советуете?

Это сообщение отредактировал(а) hter - 13.12.2013, 17:55
PM MAIL   Вверх
Фантом
Дата 13.12.2013, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(hter @  13.12.2013,  18:54 Найти цитируемый пост)

Может быть, но O(n^3). Если б в строке было 10-20 символов то не проблема, а в строке их 200 и более. 
на чем попробовать советуете?

В идале - на чистом C. В реальности лучше сначала прикинуть, насколько надо увеличить быстродействие.
PM   Вверх
OpenGL
Дата 16.12.2013, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



А как решали? Надо так - проводим хорду, далее считаем ответ для левой и правой половин, перемножаем. И, разумеется, ответы сохраняем, чтобы по нескольку раз их не считать. Такой алгоритм и с такими ограничениями, как мне кажется, и на питоне будет быстро работать.
PM MAIL   Вверх
Lipetsk
  Дата 16.12.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



hter, а есть последовательности, на которых можно потестироваться, чтоб заведомо было решение
PM   Вверх
hter
Дата 16.12.2013, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.11.2013

Репутация: нет
Всего: нет



Цитата(OpenGL @  16.12.2013,  11:54 Найти цитируемый пост)
А как решали? Надо так - проводим хорду, далее считаем ответ для левой и правой половин, перемножаем. И, разумеется, ответы сохраняем, чтобы по нескольку раз их не считать. Такой алгоритм и с такими ограничениями, как мне кажется, и на питоне будет быстро работать. 


Одних первых хорд может быть э так вариантов 100.
Я решал по кругу..от первого и перебрал какие подходят

Добавлено через 4 минуты и 13 секунд
Цитата(Lipetsk @  16.12.2013,  15:39 Найти цитируемый пост)
hter, а есть последовательности, на которых можно потестироваться, чтоб заведомо было решение 


Так можно и придумать:

CACBADBDCDAB - 2 варианта
АBABAB - 5 вариантов
АBABСDAB - 1 вариант
PM MAIL   Вверх
OpenGL
Дата 17.12.2013, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(hter @  16.12.2013,  23:00 Найти цитируемый пост)
Одних первых хорд может быть э так вариантов 100.

Ну и что? Всего состояний в динамике 100 * 199, а каждое большее состояние просчитывается за O(n) через меньшие (уже подсчитанные и сохраненные), а значит общая сложность - куб. Тормозить в данной реализации может только сам питон smile
PM MAIL   Вверх
hter
Дата 17.12.2013, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.11.2013

Репутация: нет
Всего: нет



Цитата(OpenGL @  17.12.2013,  11:17 Найти цитируемый пост)
уже подсчитанные и сохраненные

Вот что значит сохраненные?

Добавлено через 59 секунд
Может мой нубский код скинуть?

Добавлено через 4 минуты и 22 секунды
ну должно же быть решение не за O(n^3) а там за O(nlogn)
PM MAIL   Вверх
OpenGL
Дата 17.12.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(hter @  17.12.2013,  14:43 Найти цитируемый пост)
ну должно же быть решение не за O(n^3) а там за O(nlogn) 

Почему должно?  smile Тем более на таких ограничениях n^3 вполне приемлем.

Цитата(hter @  17.12.2013,  14:43 Найти цитируемый пост)
Может мой нубский код скинуть?

Что-то типа псевдокода c синтаксисом C++ smile

Код
// Посчитать ответ для строки, начинающийся в позиции s и заканчивающийся в e (не включая e).
int f(int s, int e) 
{
    if(уже_считали_ответ_для_данных_s_и_e) 
    {
        return посчитанное_значение;
    }
    // Для пустой строки примем ответ за 1
    if(s == e) return 1;
    if(количество_A_в_строке != количество_B_в_строке ||
        количество_С_в_строке != количество_D_в_строке)
    {
        return 0;
    }
    int res = 0;
    for(int i = s + 1; i != e; ++i)
    {
        // Если символы парные - проводим хорду и считаем отдельно для левой и отдельно для правой половины\
        // Поскольку любой из левой может соответствовать любому из правой, перемножаем и прибавляем к ответу
        if(символ_s_и_символ_i_парные) res += f(s + 1, i) * f(i + 1, e);
    }
    return res;
}

...
string str = ...;
f(0, str.length());

Это - вполне себе динамика, только записанная в рекурсивной форме.
Цитата(hter @  17.12.2013,  14:43 Найти цитируемый пост)
Вот что значит сохраненные?

Для каждой пары входных параметров функции, если уже считали ответ, возвращаем его сразу.
PM MAIL   Вверх
hter
Дата 17.12.2013, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.11.2013

Репутация: нет
Всего: нет



Цитата(OpenGL @  17.12.2013,  15:22 Найти цитируемый пост)
Это - вполне себе динамика, только записанная в рекурсивной форме.
Цитата(hter @  17.12.2013,  14:43 )
Вот что значит сохраненные?

Для каждой пары входных параметров функции, если уже считали ответ, возвращаем его сраз


Спасибо, попробую реализовать.

Цитата(OpenGL @  17.12.2013,  15:22 Найти цитируемый пост)
Почему должно?   Тем более на таких ограничениях n^3 вполне приемлем.


ну как то хочется, что б было))

Добавлено через 28 секунд
Цитата(OpenGL @  17.12.2013,  15:22 Найти цитируемый пост)
код C++

жаль си не знаю
PM MAIL   Вверх
OpenGL
Дата 18.12.2013, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(hter @  17.12.2013,  21:07 Найти цитируемый пост)
жаль си не знаю 

Что непонятного в этом псевдокоде? Убрать int и скобки {} - почти питон будет  smile
PM MAIL   Вверх
Lipetsk
Дата 18.12.2013, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



Цитата(hter @  16.12.2013,  23:00 Найти цитируемый пост)
Так можно и придумать:

CACBADBDCDAB - 2 варианта
АBABAB - 5 вариантов
АBABСDAB - 1 вариант 

так вроде должно быть 200 букв smile
просто случайно сгенерированная последовательность из 200 у меня имеет не более 5 возможных (с учётом правила из моего первого комментария) хорд из одного узла, а для некоторых узлов ни одного
PM   Вверх
OpenGL
Дата 18.12.2013, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(Lipetsk @  18.12.2013,  08:42 Найти цитируемый пост)
просто случайно сгенерированная последовательность из 200 у меня имеет не более 5 возможных (с учётом правила из моего первого комментария) хорд из одного узла, а для некоторых узлов ни одного 

На случайных ответ чаще всего 0 будет smile А на правильно подобранных - очень большое число.
Цитата(hter @  16.12.2013,  23:00 Найти цитируемый пост)
АBABСDAB - 1 вариант 

Тут, кстати, 5 вариантов.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1107 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.