题目:
Given a matrix of n rows and m columns,find the largest area submatrix which is non decreasing on each column
涉及算法:
悬线法
代码:
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
long long int v[2002][2002] = { 0 };
long long int H[2002][2002] = { 0 }; //存放非递减序列长度
long long int L[2002] = { 0 }, R[2002] = {0};
int main()
{
int T, n, m;
cin >> T ;
for (int i = 0; i < T; i++)
{
cin >> n >> m;
long long int ans = 0;
for (int j = 1; j <= n; j++)
{
for (int k = 1; k <= m; k++)
{
scanf("%d", &v[j][k]);
if (v[j][k] >= v[j - 1][k])
H[j][k] = H[j - 1][k] + 1;
else
H[j][k]=1;
L[k] = k;
R[k] = k;
}
for (int h = 1; h <= m; h++)
{
while (L[h] >1 && H[j][h] <= H[j][L[h] - 1])
L[h] = L[L[h] - 1];
}
for (int h = m; h >= 1; h--)
{
while (R[h] < m && H[j][h] <= H[j][R[h] + 1])
R[h] = R[R[h] + 1];
}
for (int h = 1; h <= m; h++)
{
long long int temp;
temp = (R[h] - L[h] + 1) * H[j][h];
ans = ans > temp ? ans : temp;
}
}
cout << ans << endl;
}
return 0;
}