Это должно работать. Вы всегда должны пройти через каждый элемент в подматрице, чтобы выполнить сложение, и это самый простой способ.
* обратите внимание, что следующий код может не скомпилироваться, но он верен в псевдокоде
struct Coords{
int x,y;
}
int SumSubMatrix(Coords topleft, Coords bottomright, int** matrix){
int localsum = 0;
for( int i = topleft.x; i <= bottomright.x; i++ ){
for(int j = topleft.y; j <= bottomright.y; j++){
localsum += matrix[i][j];
}
}
return localsum;
}
Редактировать: альтернативный метод предварительной обработки состоит в создании другой матрицы из оригинала, содержащей суммы строк или столбцов. Вот пример:
Оригинал:
0 1 4
2 3 2
1 2 7
Матрица строк:
0 1 5
2 5 7
1 3 10
Матрица столбца:
0 1 4
2 4 6
3 6 13
Теперь просто возьмите значения x конечной точки и вычтите значения начальной точки, как показано ниже (для строк):
for( int i = topleft.y; i >= bottomright.y; i++ ){
localsum += matrix2[bottomright.x][i] - matrix2[topleft.x][i];
}
Теперь это либо O (n), либо O (m)