题目
题目见 01间隔矩阵
大概意思就是 给一个只含有01的矩阵,找出最大的01间隔矩阵。
码不是自己的,来自luoshaochuan
输入:
5 7
0101010
1000101
0101010
1010101
0101010
输出:
21
思路
解法是DP,按行扫,对于每个元素找出左边界右边界和高度。
找边界的时候向左向右两个loop来propagete, propagete的时候要注意高度的条件,即延伸方向元素的高度不能低于当前元素。
DP表格
假设矩阵存在A[N] [N]里,左边界L[N],右边界R[N], 高度H[N].
DP的题真是,不画表格真的不能理解,智商压制。
代码
#include <iostream>
#include <string>
using namespace std;
#define maxn 2006
int R[maxn], L[maxn], H[maxn];
char A[maxn][maxn];
int main() {
int n,m;
cin >> n >> m;
for(int i = 0; i < n; ++i){
cin >> A[i];
}
int ans = 0;
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
if(i > 0 && A[i][j] != A[i-1][j]) ++H[j];
else H[j] = 1;
}
for(int j = 0; j < m; ++j) {
L[j] = j;
while(L[j] && H[j] <= H[L[j]-1] && A[i][L[j]] != A[i][L[j]-1])
L[j] = L[L[j]-1];
}
for(int j = m-1; j >=0; --j){
R[j] = j;
while(R[j] < m-1 && H[j] <= H[R[j]+1] && A[i][R[j]] != A[i][R[j]+1])
R[j] = R[R[j]+1];
}
for(int j = 0; j < m ; ++j){
ans = max(ans,H[j]*(R[j]-L[j]+1));
}
}
cout << ans << endl;
return 0;
}
最后吐槽SF的编辑器真是烂啊 。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。