思路:
就是找左下角作为顶点然后dp
f [ i ] [ j ] = m i n f [ i − 1 ] f [ j − 1 ] , f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] + 1 f[i][j] = min{f[i - 1]f[j - 1],f[i - 1][j],f[i][j - 1]} + 1 f[i][j]=minf[i−1]f[j−1],f[i−1][j],f[i][j−1]+1
C o d e Code Code:
#include <cstdio>
#include <iostream>
using namespace std;
int n,m,p,t;
int a[2001][2001][3],l[2001];
char c;
int main()
{
scanf("%d%d%d",&n,&m,&p);
for (int i = 1; i <= n; ++i)
{
getchar ();
for (int j = 1; j <= m; ++j)
{
c = getchar ();//读入
if (c == '1')
{
a[i][j][0] = 1;
a[i][j][1] = a[i][j - 1][1] + 1;//横
a[i][j][2] = a[i - 1][j][2] + 1; //竖
a[i][j][0] = min(min(a[i][j][1], a[i][j][2]), a[i - 1][j - 1][0] + 1);//DP
l[a[i][j][0]]++;
}
}
}
for (int i = max(n,m) - 1; i >= 1; --i)
l[i] += l[i + 1];//前缀和
for (int i = 1; i <= p; ++i)
{
scanf("%d", &t);
printf("%d\n", l[t]);
}
return 0;
}