![]() |
|
|
![]()
|
|
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: нет Всего: 54 |
Есть такая задачка...
Дается последовательность целых чисел... Из нее надо выбрать подпоследовательность с максимальной суммой и возможно меньшей длины... Алгоритм перебора всех подпоследовательностей не принимается, надо сделать, что-нить быстрое и гениальное... Я уверен, мы вместе это смогем... Так что пишите... :0) -------------------- ![]() |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Эти два условия противоречат друг другу, так что сперва давай конкретизируем, что же все-таки нужно сделать. |
|||
|
||||
| FdX |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 13.8.2002 Репутация: нет Всего: нет |
Да вроде смысл ясен.
Если ты имел ввиду это: Имеется последовательность целых чисел. Требуется из нее выбрать последовательность определенной длины (меньшей длины исходной послед.), сумма элементов которой будет больше суммы ЛЮБОЙ другой последовательности (полученной из исходной) заданной длины (длина та же, что и у посл. с макс. суммой). Тогда все просто. Ищи n наибольших чисел и запоминай их порядковый номер в массиве. Или запоминай в массиве сами эти числа. Если напутал - извините. Колво всех возможных послед. заданной длины выражается очень большими числами. Формулу лень выводить. А таким образом ты получишь послед. с макс суммой. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: нет Всего: 54 |
Ах, если бы все было так просто... :0( Играющую роль в формировании последовательности играет сумма элементов... Но при все при этом, звиняйте что сразу не сказал, подполедовательностью в данном случае называется не выборка эл-тов из последовательности, а группа следующих друг за другом элементов..., т.е. из последовательности [1,-1,0,5,6,-3,0,5,-2] нельзя выбрать подпоследовательность [-1,5,6,-3], а надо [-1,0,5,6,-3].... Думаем дальше... P.S. Я уже думал, может какое трай-дерево строить?.. -------------------- ![]() |
|||
|
||||
| tserbis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 28.8.2002 Где: Хмельницкий, Укра ина Репутация: нет Всего: 0 |
Ни у кого нет "Арсак. Программирование игр и головоломок"?
По-моему, там я видел решение подобной задачи в один проход. Единственное, - не уверен, что было условие про минимальность длины... |
|||
|
||||
| FdX |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 13.8.2002 Репутация: нет Всего: нет |
Ну тогда простым перебором последовательностей. Иначе вроде никак.
Если тама по порядку, то пахать это бует довольно быстро. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: нет Всего: 54 |
Тут я подумал немного, и вот что пришло на ум... Можно сделать это в два пробега...
Первый пробег: Наращиваем сумму по всем элементам и запоминаем тот элемент на котором она максимальна... Второй пробег(до максимума): Убираем из суммы элементы и запоминаем опять же максимум... Вот так вроде бы должно работать... Но есть ведь и однопроходный алгоритм... Мож кто знает... -------------------- ![]() |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Я решал эту задачу два раза. Первый раз когда я был совсем маленький, тогда я вначале не понял, что надо в один проход, а когда узнал до решения не догадался. Второй раз пару лет назад - в один проход все правильно - тогда я еще удивился, что она так просто решилась. Сейчас решения не помню, но если не будет лень, придумаю снова. -------------------- Волны гасят ветер... |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
А ну да. Алгоритм простой. Правда, как podval заметил - условие минимальности длины странное:
-1 -4 5 6 -2 -1 4 7 -3 2 и что отсюда выбрать? 5 6 -2 -1 4 7 или просто 5 6 или 4 7? А алгоритм таков: 1. Находим первое положительное число и начинаем добавлять в нашу последовательность все элементы по порядку, пока не встретиться отрицательное. 2. Нашли отрицательное запоминаем позицию где его нашли и начинаем добавлять все элементы по порядку в специальную переменну - отрицательную сумму, пока не произойдет следующее: отрицательная сумма стала больше положительной - все сбрасываем и возвращаемся к п.1 Либо, мы наткнулись на положительный элемент. В этом случае запоминаем еще один индекс и начинаем накапливать вторую положительную сумму пока не встретим отрицательный элемент. Теперь сравниваем вторую положительную сумму и отрицательную - если положительная больше включаем весь промежуток, если нет, то если первая положительная сумма больше второй - то мы нашли наш интервал, иначе вторая сумма становиться первой и начинаем искать промежуток с того индекса который мы запомнили вторым. Можно еще искать максимальный отрицателный элемент - если положительных не встретиться, то он будет искомым интервалом. -------------------- Волны гасят ветер... |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
Вроде, это классическая задача на динамическое программирование...
Посмотри алгоритм Бэлмана (поищи в сети - он должен быть) Ежели не найдешь, с делами разберусь - вышлю -------------------- С уважением, А. Фролов. |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: нет Всего: 54 |
Еще раз всем огромноое спасибо, дали пищу для размышлений...
Alex 101: шли обязательно, мало ли что я сам накопаю?.. :0) -------------------- ![]() |
|||
|
||||
| B0BAH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2005 Репутация: нет Всего: нет |
Я очень долго парился,но когда узнал решение ОФИГЕЛ:
sr:=0; smax:=0; for i:=0 to n do begin sr:=sr+a[i]; if sr<0 then sr:=0; if sr>smax then smax:=sr; end; writeln(smax); Приколите это ВСЕ! Работает 100% P.S Обещенного 3 года ждут!!!!!!!!!!!!!!!!!!!!!!!!!! Это сообщение отредактировал(а) B0BAH - 14.9.2005, 23:05 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |