点击打开链接
///最短连续子序列的二维拓展。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<cstring>
#include<string>
#include<math.h>
#include<set>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int matrix[110][110];
int num[110];
int N,M;
int K;
void merge(int i,int j){///i行到j行的合并
for(int p=0;p<M;p++){
for(int k=i;k<=j;k++){
num[p] += matrix[k][p]; ///合并成一维数组
}
}
}
int findShortest()///最短连续子序列
{
int start = 0,end = 0;
int sum = 0;
int len = M;
int ans = len + 1;///比最大的len多1
bool flag = false;
while(end < len){
if(sum < K){
sum += num[end];
}
while(sum >= K){
flag = true;
ans = min(ans,end-start+1);
sum -= num[start++];
}
end ++;
}
if(flag)
return ans;
else
return N*M; ///全部加起来值都没超过K,直接返回N*M,main函数中有min_temp比较额
}
int main()
{
while(cin>>N>>M){
cin>>K;
int sum = 0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>matrix[i][j];
sum += matrix[i][j];
}
}
if(sum < K)
cout<<-1<<endl;
else{
int min_element = N*M;
for(int i=0;i<N;i++){
for(int j=i;j<N;j++){
memset(num,0,sizeof(num));
merge(i,j);
int temp = findShortest();
temp = (j - i + 1) * temp;///二维压缩成一维来解决。
if(temp < min_element)
min_element = temp;
}
}
cout<<min_element<<endl;
}
}
return 0;
}