题目名称:最大子矩阵
题目链接:最大子矩阵
问题描述
给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。
输入
第一行包含三个整数N、M和K。
以下N行每行包含M个整数,表示A。
对于40%的数据,1 <= N, M <= 10
对于100%的数据,1 <= N, M <= 250 1 <= K <= 2147483647 1 <= A i j A_ij Aij <= 10000
输出
满足条件最大的子矩阵所包含的元素数目。如果没有子矩阵满足条件,输出-1
样例输入
3 3 9
1 2 3
2 3 4
3 4 5
样例输出
4
解题思路
使用前缀和存储从左到右矩阵元素的和,枚举不同的左右边界,使用尺取法来计算整个区域的矩阵元素和,进而得到最大元素个数
完整代码
#include<bits/stdc++.h>
using namespace std;
#define N 260
int sum[N][N],d[N],a[N][N];
int n,m,kk,ans;
int main()
{
cin>>n>>m>>kk;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
sum[i][j]=sum[i-1][j]+a[i][j];
}
}
int ans=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++) d[k]=sum[j][k]-sum[i-1][k];
int now=0;
for(int l=1,r=1;l<=m;){
while(r<=m&&now+d[r]<=kk) now+=d[r++];
ans=max(ans,(r-l)*(j-i+1));
now-=d[l++];
}
}
}
if(ans==0){
cout<<"-1"<<endl;
}else{
cout<<ans<<endl;
}
return 0;
}