最大子矩阵问题
给一个棋盘,里边有许多黑白格子,要求找出一块连续的矩形,似的矩形内部的格子全部为白色,并且面积(周长)最大。
王知昆的《浅谈用极大化思想解决最大子矩形问题》里边有讲解。这里给出模板
void solve(int x) { //x表示要求矩形的颜色0为黑色,1为白色 int i, j; for(i = 1; i <= m; ++i) { H[i] = 0; L[i] = 1; R[i] = m; } int lm, rm; for(i = 1; i <= n; ++i) { lm = 1, rm = m; for(j = 1; j <= m; ++j) { if(mp[i][j] == x) { H[j]++; if(L[j] < lm) L[j] = lm; } else { H[j] = 0; lm = j + 1; L[j] = 1; R[j] = m; } } for(j = m; j >= 1; --j) { if(H[j]) { if(R[j] > rm) R[j] = rm; ans = max(ans, (H[j] + R[j] - L[j] + 1)*2);
//这是求周长 ans = max(ans, H[j]*(R[j] - L[j] + 1)是求面积。
//当然也可以是每个格子给出一个value,然后求最大value,这样就是预处理一下整个棋盘,然后找(j, L[j]), (H[j], R[j])这块区域的value总和 } else { rm = j - 1; } } } }