牛客网收集

最小面积子矩阵

题目描述

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)

输入描述

每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值

输出描述:

输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。

输入

4 4 10
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

输出

1
#include<bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
int a[101][101];
int sum[101][101][101];//第i行的第j-k个元素之和 
int sumSquare(int rlow,int rhigh,int clow,int chigh)
{
	int s=0;
	for(int i=rlow;i<=rhigh;i++){
		s+=sum[i][clow][chigh];
	}
	return s;
}
int Size(int rlow,int rhigh,int clow,int chigh)
{
	return (rhigh-rlow+1)*(chigh-clow+1);
}
int main(void) 
{
	int n,m,k;
	while(cin>>n>>m>>k)
	{
		memset(a,0,sizeof(a));
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>a[i][j];
			}
		}
		for(int i=1;i<=n;i++){
			for(int start=1;start<=m;start++){
				int rsum=0;
				for(int end=start;end<=m;end++){
					rsum+=a[i][end];
					sum[i][start][end]=rsum;
				}
			}
		}
		int bestSize=MAX;
		for(int rfrom=1;rfrom<=n;rfrom++){
			for(int cfrom=1;cfrom<=m;cfrom++){
				for(int rto=rfrom;rto<=n;rto++){
					for(int cto=cfrom;cto<=m;cto++){
						if(Size(rfrom,rto,cfrom,cto)<bestSize){
							if(sumSquare(rfrom,rto,cfrom,cto)>=k)
							bestSize=Size(rfrom,rto,cfrom,cto);
						}
					}
				}
			}
		}
		if(bestSize==MAX) cout<<"-1"<<endl;
		else cout<<bestSize<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/coderwait/article/details/89787948