看注释叭
2026-03-17 21:50:09
发布于:江苏
0阅读
0回复
0点赞
看注释就可以了
#pragma GCC optimize(2)
#include <cstdio>
#define N 301
using namespace std;
inline int max(int a,int b) {return a > b ? a : b;}
int f[N][N][N]; // 存储上半8字形矩形面积
int sum[N][N]; // 行前缀和,快速判断区间是否合法
int map[N][N]; // 存储地图
int n, ans, p;
char s[N];
int main()
{
scanf("%d", &n);
for (int i = 1;i <= n; ++i)
{
scanf("%s", s + 1);
for (int j = 1;j <= n; ++j)
map[i][j] = s[j] == '*' ? 1 : 0, // 缺陷记1,合法记0
sum[i][j] = sum[i][j - 1] + map[i][j];
}
// 预处理上半部分8字矩形面积
for (int i = 1;i < n - 1; ++i)
for (int j = i + 2;j <= n; ++j)
{
p = 0;
for (int k = 1;k <= n; ++k)
{
if (map[k][i] || map[k][j]) p = 0;
if (sum[k][i - 1] == sum[k][j])
!p ? p = k : f[k][i][j] = (k - p - 1) * (j - i - 1);
}
}
// DP优化,继承最大面积
for (int k = 1;k <= n; ++k)
{
for (int j = n;j > 3; --j)
for (int i = j - 3;i >= 0; --i)
if (sum[k][i - 1] == sum[k][j]) f[k][i][j] = max(f[k][i][j], f[k][i + 1][j]);
for (int i = 1;i < n - 1; ++i)
for (int j = i + 3;j <= n; ++j)
if (sum[k][i - 1] == sum[k][j]) f[k][i][j] = max(f[k][i][j], f[k][i][j - 1]);
}
// 计算下半部分,统计答案
for (int i = 1;i < n - 1; ++i)
for (int j = i + 2;j <= n; ++j)
{
p = 0;
for (int k = n;k; --k)
{
if (map[k][i] || map[k][j]) p = 0;
if (sum[k][i - 1] == sum[k][j]) (!p) ? p = k : ans = max(ans, f[k][i][j] * (p - k - 1) * (j - i - 1));
}
}
if (!ans) printf("-1");
else printf("%d", ans);
return 0;
}
这里空空如也




有帮助,赞一个