当前位置:   article > 正文

【机试】最小面积子矩阵_2. 一个n*m的矩阵,找出这个矩阵中所有元素的和不小于k的面积最小的子矩阵(矩阵中

2. 一个n*m的矩阵,找出这个矩阵中所有元素的和不小于k的面积最小的子矩阵(矩阵中

最小面积子矩阵

来源:上海交通大学

题目描述

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

输入描述

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

输出描述:

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

输入

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

输出

1
  1. #include<bits/stdc++.h>
  2. #define MAX 0x3f3f3f3f
  3. using namespace std;
  4. int a[101][101];
  5. int sum[101][101][101];//第i行的第j-k个元素之和
  6. int sumSquare(int rlow,int rhigh,int clow,int chigh)
  7. {
  8. int s=0;
  9. for(int i=rlow;i<=rhigh;i++){
  10. s+=sum[i][clow][chigh];
  11. }
  12. return s;
  13. }
  14. int Size(int rlow,int rhigh,int clow,int chigh)
  15. {
  16. return (rhigh-rlow+1)*(chigh-clow+1);
  17. }
  18. int main(void)
  19. {
  20. int n,m,k;
  21. while(cin>>n>>m>>k)
  22. {
  23. memset(a,0,sizeof(a));
  24. memset(sum,0,sizeof(sum));
  25. for(int i=1;i<=n;i++){
  26. for(int j=1;j<=m;j++){
  27. cin>>a[i][j];
  28. }
  29. }
  30. for(int i=1;i<=n;i++){
  31. for(int start=1;start<=m;start++){
  32. int rsum=0;
  33. for(int end=start;end<=m;end++){
  34. rsum+=a[i][end];
  35. sum[i][start][end]=rsum;
  36. }
  37. }
  38. }
  39. int bestSize=MAX;
  40. for(int rfrom=1;rfrom<=n;rfrom++){
  41. for(int cfrom=1;cfrom<=m;cfrom++){
  42. for(int rto=rfrom;rto<=n;rto++){
  43. for(int cto=cfrom;cto<=m;cto++){
  44. if(Size(rfrom,rto,cfrom,cto)<bestSize){
  45. if(sumSquare(rfrom,rto,cfrom,cto)>=k)
  46. bestSize=Size(rfrom,rto,cfrom,cto);
  47. }
  48. }
  49. }
  50. }
  51. }
  52. if(bestSize==MAX) cout<<"-1"<<endl;
  53. else cout<<bestSize<<endl;
  54. }
  55. return 0;
  56. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/800311
推荐阅读
相关标签
  

闽ICP备14008679号