Мне нужно написать программу, которая принимает квадратную матрицу целых чисел и выводит наибольшую сумму субквадратной матрицы. Первая строка ввода представляет собой целое число, которое указывает размерность квадратной матрицы, за которой следует строка за строкой фактической матрицы.
У меня работает программа, однако она выдает наибольшую сумму прямоугольника ине квадрат, который требуется.
Пример ввода:
3
1 2 3
4 5 6
-7 -8 -9
Вывод: должно быть 16 (2 + 3 + 5 + 6), но выводится 21 (1 + 2 + 3 + 4 + 5 + 6)
Вот мойкод:
#include<iostream>
using namespace std;
int kadaneAlgo(int arr[], int& start, int& end, int n)
{
//find max sum and starting and ending location
int sum = 0, maxSum = INT_MIN;
end = -1; //at first no place is selected
int tempStart = 0; //starting from 0
for (int i = 0; i < n; i++) {
sum += arr[i];
if (sum < 0) {
sum = 0;
tempStart = i + 1;
}
else if (sum > maxSum)
{
//get maximum sum, and update start and end index
maxSum = sum;
start = tempStart;
end = i;
}
}
if (end != -1)
return maxSum;
//when all elements are negative in the array
maxSum = arr[0];
start = end = 0;
// Find the maximum element in array
for (int i = 1; i < n; i++) {
if (arr[i] > maxSum) {
maxSum = arr[i];
start = end = i;
}
}
return maxSum;
}
void maxSqSum()
{
int maxSum = INT_MIN;
int n;
cin >> n;
int left, right;
int temp[n], sum, start, end;
int mat[100][100];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> mat[i][j];
}
}
for (left = 0; left < n; left++) {
for (int i = 0; i < n; i++)//temp initially holds all 0
temp[i] = 0;
for (right = left; right < n; ++right)
{
//for each row, find the sum
for (int i = 0; i < n; ++i)
temp[i] += mat[i][right];
sum = kadaneAlgo(temp, start, end, n);
//find sum of square
if (sum > maxSum) {
//find maximum value of sum, then update corner points
maxSum = sum;
}
}
}
cout << maxSum;
}
int main()
{
maxSqSum();
}