这个题时间复杂度好迷啊,神一样的n^6模拟也能跑!暴力踩标算,n方过百万。
#include<cstdio>
#include<iostream>
using namespace std;
int a[105][105];
int b[105][105];
int m,n,tot=0;
bool del(int i,int j)
{
for(int i1=1;i1<=m;i1++)
for(int j1=1;j1<=n;j1++)
b[i1][j1]=a[i1][j1];
for(int p1=1;p1<=m;p1++)
for(int p2=1;p2<=n;p2++)
{
if(!b[p1][p2]) continue;
if(p1+i-1>m||p2+j-1>n)
return false;
int t=b[p1][p2];
for(int v1=0;v1<i;v1++)
for(int v2=0;v2<j;v2++)
{
if(b[p1+v1][p2+v2]<t) return false;
b[p1+v1][p2+v2]-=t;
}
}
return true;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
tot+=a[i][j];
}
int ans=1e9;
for(int i=m;i>=1;i--)
for(int j=n;j>=1;j--)
{
if(tot%(i*j)) continue;
if(del(i,j))
{
ans=min(ans,tot/(i*j));
break;
}
}
printf("%d",ans);
return 0;
}