Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
11 / 11 / 6
Регистрация: 04.01.2013
Сообщений: 67

Максимальная (по площади) подматрица с заданной суммой элементов

08.03.2015, 14:27. Показов 2183. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Никогда не работал с матрицами, а тут вот пришлось.

Задача:
Входные данные: квадратная матрица целых чисел А произвольного размера size (элементы могут быть и отрицательными), число max
Выходные данные: координаты прямоугольной подматрицы, выполняющей следующие условия:
  1. Сумма элементов подматрицы меньше либо равна max
  2. Из всех таких подматриц данная содержит максимальное количество элементов

"Красивое" условие задачи:
Кликните здесь для просмотра всего текста
В наше время операции на фондовом рынке зависят от скорости обработки данных и принятия решений. Задача будет заключаться в создании системы поддержки спекуляции землей. Мы предполагаем, что у нас есть карта земли для покупки / продажи. Эта карта имеет квадратную форму и разделена на N х N квадратов (участков). Участок неделимый и имеет для дальнейшего рассмотрения единичный размер. Необходимо найти прямоугольный фрагмент карты (т.е. X и Y участков, N ≤ X, Y ≤ N) в соответствии со следующими критериями:
  1. Наибольший фрагмент такой, что общая стоимость участков меньше или равна указанному пределу. На входе есть карта NxN участков, цена каждого участка известна. Цена может быть как положительной, так и отрицательной (за участком закреплён долг). Задача состоит в том, чтобы найти прямоугольную область с наибольшей площадью, где общая стоимость не превысит указанного значения. Если таких областей несколько, то найти по крайней мере одину из них. В противном случае сообщить, что за эти деньги ничего нельзя купить.
  2. Второе условие является задачей по поиску наибольшей подматрицы, все числа которой не превосходят заданную границу


Стоит отметить, что алгоритм должен хорошо рапараллеливаться, так как приложение будет многопоточным.

Нагуглить алгоритмы решения конкретно этой проблемы не получилось.
Ничего лучше простого перебора я пока не придумал:

Далее координаты подматрицы будут записываться в такой форме [x координата меньшего (ближе к началу координат) угла, y координата меньшего угла, x, y большего угла]

Первое, что мы сделаем - посчитаем дополнительную матрицу S такую, что
https://www.cyberforum.ru/cgi-bin/latex.cgi?S[m,n] = \sum_{i=0}^{m}\sum_{j=0}^{n}A[i,j]

Тогда мы можем найти сумму любой подматрицы за константу:
https://www.cyberforum.ru/cgi-bin/latex.cgi?Sum(x_1,y_1,x_2,y_2) = Shttps://www.cyberforum.ru/cgi-bin/latex.cgi?\left[x_1,y_1\right] + S\left[x_2,y_2\right] - S\left[x_1,y_2\right] - S\left[x_2,y_1\right]

Вот сам алгоритм (псевдокод):
Оператор со - это for, итерации которого равномерно распределяются между потоками
Функция Area(...) возвращает площадь прямоугольника, ограниченного двумя точками
Функция RenewAns(...) перезаписывает раннее найденный максимум только что найденным
C++
1
2
3
4
5
6
7
8
9
co x1 in 0:size-1
  co y1 in 0:size-1
    for x2 in size-1:x1
      for y2 in size-1:y1
        if ( Sum(x1, y1, x2, y2) <= max &&
             Area(x1, y1, x2, y2) >  maxArea ) {
              RenewAns(x1, y1, x2, y2);
              break;
         }
Если у вас есть какие-то соображения по поводу того, как это можно улучшить, или знаете название алгоритма, который решает данную проблему, не стесняйтесь об этом написать в комментариях

Ещё раз напомню, в матрице могут встречаться и отрицательные числа!

Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2015, 14:27
Ответы с готовыми решениями:

Массив: В произвольно заданной матрице размера 4*6 определить строку с максимальной суммой элементов и столбец с минимальной суммой.
В произвольно заданной матрице размера 4*6 определить строку с максимальной суммой элементов и столбец с минимальной суммой.

Подсписок с заданной суммой элементов.
Здравствуйте! Подскажите пожалуйста как можно написать эту программу. Написать программу, которая для заданного списка (множества...

Найти количество подматриц с заданной суммой элементов
Результат эксперимент представляет из себя матрицу из 0 &lt; N &lt;= 1000 строк и 0 &lt; М &lt;= 1000 столбцов, выполненную целыми числами по модулю...

1
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
11.03.2015, 15:01
Пока только грубые поправки -
Code
1
2
    for x2 in size-1:x1
      for y2 in size-1:y1
Здесь цикл должен идти от меньшего к большему (все таки общепринято, да и обратный порядок не играет роли в данной задаче)

Введение дополнительной матрицы правильный ход, только не нужно её в лоб находить (излишняя сложность)
S(x,y)=A(x,y)+S(x-1,y)+S(x,y-1)-S(x-1,y-1)
S(x,y)=0 если x<0 или y<0

Вычисление суммы должно быть немного по другому,
Sum(x,y,xx,yy) = S(xx,yy) + S(x-1,y-1) - S(xx,y-1) - S(x-1,yy) x<xx, y<yy
иначе сумма по под-матрицам единичного размера будет равна нулю, а по остальным потеряем первую строку и столбец
Либо координаты x1 и y1 должны быть на 1 меньше координат первого элемента под-матрицы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2015, 15:01
Помогаю со студенческими работами здесь

В заданной прямоугольной матрице найти столбец с минимальной суммой элементов
В заданной прямоугольной матрице найти столбец с минимальной суммой элементов.

В заданной целочисленной матрице найти столбец с минимальной суммой элементов
Среди столбцов заданной целочисленной матрицы, включающие только такие элементы, которые по модулю не более 10, найти столбец с минимальной...

В заданной матрице поменять строку с минимальной суммой со строкой с максимальной суммой
помогите с кодом

Вычисление площади и периметра квадрата и прямоугольника, описанных вокруг круга заданной площади S
Составить программу для вычисления площади и периметра квадрата и прямоугольник, описанных вокруг круга заданной площади S.

В заданной матрице найти номера всех столбцов с минимальной суммой элементов
В заданной матрице найти номера всех столбцов с минимальной суммой элементов. Вывести подматрицу из этиц столбцов в файл. Как написать эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru