唯一的浙江
2026-05-19 21:24:11
发布于:浙江
5阅读
0回复
0点赞
#include<cstdio>
#define N 2005
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;
int up[N][N]; // 从(i,j)向上连续相同数字的长度(包含自身)
int left[N][N]; // 以(i,j)为底边的矩形能向左延伸到的最小列号(基于当前行的连续区域)
int right[N][N]; // 以(i,j)为底边的矩形能向右延伸到的最大的列号
int a[N][N]; // 存储原始矩阵(0/1)
int ansa, ansb; // ansa: 最大全等正方形的面积;ansb: 最大全等矩形的面积
int m, n;
int main() {
scanf("%d%d", &n, &m);
// 初始化:读入矩阵,并设置初始的up, left, right
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
up[i][j] = 1; // 初始自己一个,长度为1
left[i][j] = j; // 向左最远到自己
right[i][j] = j; // 向右最远到自己
scanf("%d", &a[i][j]);
}
}
// 计算每一行内,基于“相邻不同”的规则,left[i][j]的实际值
// 如果 a[i][j] 和 a[i][j-1] 不同,则 (i,j) 可以继承 (i, j-1) 的最左边界
for (int i = 1; i <= n; i++) {
for (int j = 2; j <= m; j++) {
if (a[i][j] ^ a[i][j-1]) { // 不同
left[i][j] = left[i][j-1];
}
}
}
// 计算每一行内,基于“相邻不同”的规则,right[i][j]的实际值
// 如果 a[i][j] 和 a[i][j-1] 不同,则 (i, j-1) 可以继承 (i, j) 的最右边界
for (int i = 1; i <= n; i++) {
for (int j = m; j > 1; j--) {
if (a[i][j] ^ a[i][j-1]) {
right[i][j-1] = right[i][j];
}
}
}
// 动态规划递推:从上到下扫描
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
// 如果能和上方格子组成同一颜色块(相邻不同)
if (i > 1 && (a[i][j] ^ a[i-1][j])) {
up[i][j] = up[i-1][j] + 1; // 高度+1
// 最左边界取当前行算出的左边界,和上一行的左边界的最大值(取交集)
left[i][j] = max(left[i][j], left[i-1][j]);
// 最右边界取当前行算出的右边界,和上一行的右边界的最小值(取交集)
right[i][j] = min(right[i][j], right[i-1][j]);
}
// 当前高度下,能得到的矩形宽度
int width = right[i][j] - left[i][j] + 1;
int height = up[i][j];
// 最大正方形:边长取宽和高的较小值,面积平方
int side = min(width, height);
ansa = max(ansa, side * side);
// 最大矩形:直接宽×高
ansb = max(ansb, width * height);
}
}
printf("%d\n%d", ansa, ansb);
return 0;
}
核心思路解释
条件判断
a[i][j] ^ a[i][j-1] 是异或运算,不同为1,相同为0。
题目要求形成的子矩阵满足相邻格子数字不同(其实是01棋盘色,但这里是扩展成连通块,即矩形内数字全等,但注意边界处恰好是不同数字才连接)。
实际上这段代码写成了:如果上下或左右数字不同,则它们属于同一个“可扩展矩形块”,否则是边界。
left/right 计算
先按行计算初始左右边界(基于同行的相邻不同规则),再在逐行递推时取与上一行的交集,以保证矩形上下都是相同数字。
up 计算
表示从当前格子向上相同数字(与上方数字不同)的连续长度。
矩形面积
宽 = right - left + 1,高 = up,直接相乘就是当前可能的最大矩形。
正方形 = min(宽, 高) 取平方。
注意
这个解法实际上是一个求最大全同(且上下左右相邻值均不同)矩形的变形。
原始用途常见于洛谷 P1169 / P4147 这类“最大01交错子矩阵”问题。
最后浙江是存在的







有帮助,赞一个