AcWing 3487. 最小面积子矩阵 知识点:前缀和

74 阅读1分钟

3487. 最小面积子矩阵 - AcWing题库

#include<iostream> 
#include<cstring>
#include<algorithm>

using namespace std;

const int N=110,INF=1e5+10;
int n,m,k;
int s[N][N];//定义每一列的前坠和

int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>s[i][j];
            s[i][j]+=s[i-1][j];
        }

    int res=INF;//初始面积
    for(int x=1;x<=n;x++) //对行进行枚举 
    {
        for(int y=x;y<=n;y++)
        {
         for(int i=1,j=1,sum=0;i<=m;i++)//对列进行枚举
         {
            sum+=s[y][i]-s[x-1][i];//进行出第i列的的 x-y行的和
              while(sum-(s[y][j]-s[x-1][j])>=k)
              {
                sum-=s[y][j]-s[x-1][j];
                j++;//去掉j列,走向下一列 

               } 
             //这里sum就是小于k的了
               if(sum>=k)res=min(res,(y-x+1)*(i-j+1));   
          } 


        }

    }

    if(res==INF)res=-1;
     cout<<res<<endl;       

    return 0;

 }