写了两个小时,最后发现好像不是用dp完成的
题目描述
农夫约翰在一片边长为 N 英里的正方形土地中放牛。
它的牛只能在这片土地里吃草。
这片土地可以看作是一个 N×N 的方格矩阵。
其中一部分方格区域的土地已经被破坏了。
现在约翰想要统计目前还有多少个可以用来放牧的正方形区域土地。
边长大于 2 且内部完好无损的正方形土地被视为可用来放牧的土地。
在统计可用来放牧的不同正方形区域的个数时,一些方格区域可以被重复考虑。
样例
6
101111
001111
111111
001111
101101
111001
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=255;
char a[N][N];
int siz[N][N],n;
int num[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
string x;
cin>>x;
for(int j=0;j<size(x);j++)
{
a[i][j]=x[j];
if((a[i][j]-'0')==1) siz[i][j]=siz[i-1][j]+1;
else siz[i][j]=0;
}
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='1')
{
int k=j+1;
while(a[i][k]=='1')
{
bool st=true;
for(int l=j;l<=k;l++)
{
if(siz[i][l]<(k-j+1))
{
st=false;
break;
}
}
if(st) num[k-j+1]++;
k++;
}
}
}
}
for(int i=2;i<=n;i++)
{
if(num[i]) cout<<i<<' '<<num[i]<<endl;
}
return 0;
}