解析:
先把每行做前缀和(方便求区间和),枚举开始列和结束列,按行做双指针求和,找到和大于等于k的最小矩阵,时间复杂度O(N^3)。
#include <bits/stdc++.h>
using namespace std;
int m,n,k;
int a[105][105];
int ans=1e9;
int main() {
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char ch;
cin>>ch;
a[i][j]=a[i][j-1]+ch-'0';//每行做前缀和
}
}
for(int i=1;i<=m;i++){//枚举开始列
for(int j=i;j<=m;j++){//枚举结束列
int sum=0;//矩阵和
int p=0;//矩阵起点行(不包含第p行)
for(int l=1;l<=n;l++){//枚举结束行
sum+=a[l][j]-a[l][i-1];//加上当前行的和
while (sum>=k){//只要和大于等于k
ans=min(ans,(j-i+1)*(l-p));//取最小值
p++;//起点行增加
sum-=a[p][j]-a[p][i-1];//去掉起点行的和
}
}
}
}
cout<<ans;
return 0;
}
标签:ch,前缀,int,C++,T1,2024,每行,ans,105 From: https://blog.csdn.net/qq_36230375/article/details/140263799