当前位置:   article > 正文

牛客_ 最小面积子矩阵_给你一个 n×m的矩阵,每个格子里都会有一个1~k的数,要你找一个面积最小的子矩阵

给你一个 n×m的矩阵,每个格子里都会有一个1~k的数,要你找一个面积最小的子矩阵

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

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

输出

1

Ps:出错时,牛客的用例 只提示一个 99 99 10000   的用例 ,数量很大,无法用来检验。

故此特地提供一个用例,可以供大家简单自己代码使用

输入

4 4 15
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -1

输出

6

 

博主的代码:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int N,M,K;
  6. while(cin>>N>>M>>K){
  7. int matrix[N][M];
  8. for(int i=0;i<N;i++)
  9. for(int j=0;j<M;j++)
  10. cin>>matrix[i][j];
  11. int minS=123123123;
  12. for(int i=0;i<N;i++){
  13. int b[M]={0};
  14. for(int j=i;j<N;j++){
  15. int linecount=j-i+1;
  16. for(int k=0;k<M;k++) b[k]+=matrix[j][k];
  17. int rowcount=0,k=0,temp=0;
  18. for(;k<M;k++){
  19. temp+=b[k]; //temp为 从i~j行,rowcount~k列的总值
  20. if(temp>=K){ //该子矩阵达到要求
  21. if(minS>linecount*(k-rowcount+1)) //更新最小面积
  22. minS=linecount*(k-rowcount+1);
  23. if(minS==1){ //已达到所能达到最小值,剪枝
  24. printf("1\n");
  25. return 0;
  26. }
  27. k=rowcount++; //从下一列开始从新计算
  28. temp=0;
  29. }
  30. }
  31. }
  32. }
  33. if(minS==123123123) printf("-1\n");
  34. else printf("%d\n",minS);
  35. }
  36. return 0;
  37. }

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号