暴力枚举,其中先按数值进行判断,枚举只枚举矩形的左上角。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int save[110][110];
int op[110][110];
int sum,n,m;
int check(int l,int r)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
op[i][j]=save[i][j];
}
}
int times=0;
int cost;
for(int i=1;i<=n-l+1;i++)
{
for(int j=1;j<=m-r+1;j++)
{
if(op[i][j])
{
times+=op[i][j];
cost=op[i][j];
for(int s=i;s<=i+l-1;s++)
{
for(int t=j;t<=j+r-1;t++)
{
if(op[s][t]<cost)
return 0;
else
op[s][t]-=cost;
}
}
}
}
}
return times;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&save[i][j]);
sum+=save[i][j];
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(sum%(i*j)!=0)
continue;
if(check(i,j)*i*j==sum)
{
ans=max(ans,i*j);
}
}
}
printf("%d",sum/ans);
return 0;
}