Максимальная сумма среди всех (axb) подматриц для заданных Q запросов
Дана матрица mat[][] размера N x M и массив запросов[] размера Q, содержащий пары (a, b) . Задача состоит в том, чтобы найти максимальную сумму среди всех (axb) подматриц матрицы mat[][] .
Note: The rows and columns of the sub-matrix must be contiguous.
Примеры:
Input: N = 3, M = 4, Q = 1, queries[] = {(3, 2)}
mat[][] = {{1, 2, 3, 9},
{4, 5, 6, 2},
{8, 3, 2, 6}}
Output: 28
Explanation:
Here a = 3 and b = 2
The first 3×2 submatrix is:
1 2
4 5
8 3
The sum of elements in this is 23.
The second 3×2 submatrix is:
2 3
5 6
3 2
The sum of elements in this is 21.
The third 3×2 submatrix is:
3 9
6 2
2 6
The sum of elements in this is 28.
The maximum among these are 28.Input: N = 3, M = 4, Q = 3, queries[] = {(1, 1), (2, 2), (3, 3)}
mat[][] = {{1, 2, 3, 9},
{4, 5, 6, 2},
{8, 3, 2, 6}}
Output: 9 20 38
Наивный подход: самый простой подход к решению этой проблемы — для каждого запроса найти сумму каждой подматрицы и вывести наибольшую из них.
Временная сложность: O(Q*(N*M)^2), где Q — количество запросов, N и M — количество строк и столбцов матрицы mat[][].
Вспомогательное пространство: O(1)
Эффективный подход: эту проблему можно решить, выполнив некоторую предварительную обработку, прежде чем отвечать на все запросы. Выполните следующие шаги, чтобы решить эту проблему:
- Объявите двумерный массив dp , где dp[i][j] хранит сумму элементов от (0, 0) до (i, j).
- Сделайте некоторую предварительную обработку для ввода mat[][]. Объявите функцию, скажем, preProcess(mat, dp, n, m), выполните следующие шаги:
- Итерация в диапазоне [0, m-1], используя переменную i и Обновите dp[0][i] как mat[0][i].
- Выполните итерацию в диапазоне [1, n-1], используя переменную i :
- Выполните итерацию в диапазоне [0, m-1], используя переменную j:
- Обновите dp[i][j] до dp[i-1][j] + mat[i][j].
- Выполните итерацию в диапазоне [0, m-1], используя переменную j:
- Итерация в диапазоне [0, n-1] с использованием переменной i :
- Выполните итерацию в диапазоне [1, m-1], используя переменную j:
- Обновите dp[i][j] до dp[i][j] + dp[i][j-1].
- Выполните итерацию в диапазоне [1, m-1], используя переменную j:
- Объявите массив maxSum для хранения ответов на каждый запрос.
- Объявите функцию, скажем, sumQuery(dp, tli, tlj, rbi, rbj), где tli и tlj — номер строки и номер столбца в левом верхнем углу подматрицы запроса соответственно, rbi и rbj — номер строки и номер столбца в правом нижнем углу. подматрицы запроса, которые вычисляют сумму подматрицы за время O(1) .
- Инициализируйте переменную res как dp[rbi][rbj] для хранения суммы подматрицы.
- Если tl i больше 0 , то удалите элементы между (0, 0) и (tli-1, rbj) .
- Если tlj больше 0, то удалите элементы между (0, 0) и (rbi, tlj-1).
- Если tli больше 0 и tlj больше 0, то добавьте dp[tli-1][tlj-1] , так как элементы между (0, 0) и (tli-1, tlj-1) вычитаются дважды.
- Выполните итерацию в диапазоне [0, q-1], используя переменную qi :
- Выполните итерацию в диапазоне [0, n-запросов[qi][0]] , используя переменную i:
- Выполните итерацию в диапазоне [0, m-queries[qi][1]] с использованием переменной j :
- Обновите maxSum[qi] до max maxSum[qi] и sumQuery(dp, i, j, i + query[qi][0] – 1, j + query[qi][1] – 1)).
- Выполните итерацию в диапазоне [0, m-queries[qi][1]] с использованием переменной j :
- Выполните итерацию в диапазоне [0, n-запросов[qi][0]] , используя переменную i:
- После выполнения вышеуказанных шагов выведите массив maxSum в качестве ответа на каждый запрос.
Ссылка: https://www.geeksforgeeks.org/submatrix-sum-queries/
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(Q*N*M), где Q — количество запросов, N и M — количество строк и столбцов матрицы mat[][].
Вспомогательное пространство: O(N*M)