Maximal submatrix
题目大意:求最小的每列递增的矩阵
解题思路:dp思路
黑色字体表示给的矩阵,黄色字体表示我存入dp里面的值,每当每列的值递增时,dp的值就加一,不然就重新变为一,最后循环每行,判断连续的个数*其中dp值的最小值就是最小矩阵的个数
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e3+2;
int cnt[N][N];//存储数据
int dp[N][N];//也可以转化为一维
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
dp[i][j]=1;
scanf("%d",&cnt[i][j]);
if(i>1&&cnt[i][j]>=cnt[i-1][j]) dp[i][j]=dp[i-1][j]+1;//如果上一个小于此时,那么dp+1,不然重新变为1
}
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout << dp[i][j] << ' ';
}
cout << endl;
}
*/
int res=0,con=0,Min=N;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(dp[i][j]!=1){//表示上一级可以连续
con++;//连续个数
Min=min(Min,dp[i][j]);
if(j==m&&con){//循环最后也判断
res=max(res,con*Min);//更新最大值
con=0;//重置
Min=N;//重置
}
}
else{//碰到一说明此时最小矩阵断开,与上面相似
res=max(res,con*Min);
con=0;
Min=N;
}
}
}
res=max(res,m);//如果小于行数的个数,改变res
printf("%d\n",res);
}
return 0;
}