动态规划题,首先求出每个格子向上的连续白色格子的数量,然后对于每一行,从左到右依次加上能组合的白色矩形的数量。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 105;
char mp[MAXN][MAXN]; //棋盘
int high[MAXN][MAXN]; //每个格子向上的连续白色格子的数量
int main()
{
int n;
while (cin >> n)
{
memset(high, 0, sizeof(high));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> mp[i][j];
if (mp[i][j] == '.')
high[i][j] = high[i - 1][j] + 1;
else
high[i][j] = 0;
}
}
int total = 0; //白色矩形数量
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int minHigh = high[i][j];
total += minHigh;
for (int k = j - 1; k >= 1; k--)
{
if (high[i][k] < minHigh)
minHigh = high[i][k];
total += minHigh;
}
}
}
cout << total << endl;
}
return 0;
}
继续加油。