IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Flip, найти максимальную сумму матрицы путем умножения линий и столбиков на
DarkWishmaster
сообщение 4.07.2011 19:40
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Привет. Вот интересная задача:
Дана матрица NxM где её элементы положитнльные и отрицательные числа. Можно умножить сколько раз угодно любую линию и любой столбик на -1. Найдите максимальную суму чисел из матрицы которая может получиться путем этих умножений.
Например:
5 3
4 -2 2
3 -1 5
2 0 -3
4 1 -3
5 -3 2
Умножаем 3 линию и 2 столбик. Сума=28.
Есть идеи как это вообще сделать?
Сначала я думал что можно пройтись по линиям и столбикам и если по модулю сума отрицательных чисел больше положительных то умножаем на -1, но такой способ не помогает так как когда мы умножаем линию то изменются и колоны и наоборот.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 5.07.2011 12:16
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
овсем забыл: 1<=N,M<=18,
В таком случае подобный моему метод решения вполне допустим. Надо только изменить типы с Integer на Longint...

Цитата
Обьясните пожалуйста вот эту строку:
Давай я лучше объясню сам алгоритм сначала? Итак. Решение основано на полном переборе всех возможных вариантов: каждая из строк может либо умножаться на (-1), либо нет. То же самое касается и столбцов. Поэтому делаем цикл от 0 до 2число_строк - 1 и в нем проверяем все возможные комбинации. То есть, при N = 3 цикл будет от 0 до 23 - 1, т.е., 0 .. 7. Запиши эти значения в двоичном виде - получишь:

000
001
010
011
100
101
110
111
Т.е., все возможные комбинации. Здесь бит, равный 0 означает, что со строкой ничего делать не надо, а равный 1 - что ее надо изменить. Как изменить - понятно, домножить на (-1). Теперь делаем вложенный цикл, которые делает то же самое со столбцами, и считаем для каждого варианта сумму всех элементов матрицы...

Теперь по поводу строки
minusi := 1 - 2 * ((rows shr i) and $1);
Здесь minusi будет равно 1, если Rows в i-том бите справа содержит 0 (то есть, строку номер i изменять не надо), и -1, если i-ый бит Rows установлен в 1. То есть, этой строкой я просто напросто вытаскиваю нужный бит из проверяемого в данный момент варианта Rows (с Cols то же самое), а потом домножаю элемент матрицы на (minusi * minusj) при суммировании... Так учитываются все изменения строк/столбцов без фактического изменения элементов матрицы...

Цитата
Ещё это $1. Я так понял если (rows shr i) четно то выдает 0 иначе 1.
Правильно понял. Но ведь (rows shr i) будет четно только тогда, когда бит номер i равен 0, иначе (если бит единичный) оно нечетно... А если отнять от 1-цы удвоенное значение ((rows shr i) and $1), то получишь 1, если бит был сброшен (поскольку 1 - 2 * 0 = 1), и (-1), если бит был установлен (поскольку 1 - 2 * 1 = -1)... Вот такая небольшая хитрость smile.gif

Сообщение отредактировано: IUnknown - 5.07.2011 12:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkWishmaster
сообщение 5.07.2011 12:40
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


IUnknown,
Надеюсь я понял:
первые два цикла перебирают абсолютно все комбинации столбцов и линий в двоичной системе, а последнее два считывают суму этого варианта. Супер! Самое интересное что матрицу это никак не изменяют.


Сообщение отредактировано: DarkWishmaster - 5.07.2011 12:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
DarkWishmaster   Flip   4.07.2011 19:40
sheka   Можно выбрать только одну строку и одинстолбец?   4.07.2011 19:54
DarkWishmaster   Можно выбрать только одну строку и одинстолбец? ...   4.07.2011 22:11
Krjuger   Самый простой вариант сделать полный перебор)))Но ...   5.07.2011 0:24
Lapp   Самый простой вариант сделать полный перебор)))Но ...   5.07.2011 1:52
Unconnected   Перебирать тут наверное оочень долго можно.. может...   5.07.2011 1:56
Lapp   DarkWishmaster, ограничения на размеры матрицы нак...   5.07.2011 8:49
DarkWishmaster   DarkWishmaster, ограничения на размеры матрицы на...   5.07.2011 11:39
IUnknown   По всем вариантам от 0 до (2N - 1) и от 0 до (2M -...   5.07.2011 9:03
IUnknown   В таком случае подобный моему метод решения вполне...   5.07.2011 12:16
DarkWishmaster   IUnknown, Надеюсь я понял: первые два цикла переби...   5.07.2011 12:40
TarasBer   Я тут подумал немного. 1. Если разешить переворач...   5.07.2011 12:57
DarkWishmaster   IUknown, Вообщем твое решение дает 20 баллов из 10...   5.07.2011 13:31
TarasBer   Опа, стобальное решение как моё. > Эту строку ...   5.07.2011 13:45
IUnknown   Вот и спрашивай у автора этого решения. Я в чужом ...   5.07.2011 13:49
TarasBer   Если бы в онлайн-тестах хотя бы примерно указывало...   5.07.2011 13:54
Unconnected   С другой стороны, учит находить острые углы в код...   5.07.2011 14:02
TarasBer   > С другой стороны, учит находить острые углы в...   5.07.2011 14:05


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 17.07.2025 1:00
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"