数矩形,开始被sample迷惑了。。他给的情况比较简单,没有2*2的矩形,我就枚举了最小边长为1的矩形,直接WA了。。后来看了看大神的题解加上自己的一点点思考再写就AC了。。思路就是保存每个格子同行往右的最大连续白格子数,然后对每个格子再按行枚举矩形,宽度为遍历过程中的最小宽度。。仔细想想应该就明白,讲不大清,看代码吧。。
#include<stdio.h>
#include<string.h>
static int min(int a, int b)
{
return a < b ? a : b;
}
int main()
{
char s[100][100];
int a[100][100];
int n;
while (scanf("%d", &n) != EOF)
{
getchar();
int i, j, k;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
s[i][j] = getchar();
getchar();
}
memset(a, 0, sizeof(a));
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (s[i][j] == '.')
{
if (j && a[i][j - 1])
a[i][j] = a[i][j - 1] - 1;
else
for (k = j; k < n && s[i][k] == '.'; k++)
a[i][j]++;
}
int res = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (a[i][j])
{
res += a[i][j];
int minl = a[i][j];
for (k = i + 1; k < n && a[k][j]; k++)
{
minl = min(minl, a[k][j]);
res += minl;
}
}
printf("%d\n", res);
}
return 0;
}