首页 > 代码库 > HDU 2870 Largest Submatrix
HDU 2870 Largest Submatrix
这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版
如果按照上面由简到易的顺序来做的话,还是很简单的
这道题的思想就是 枚举+DP
因为某些字符可以变值,所以我们枚举a, b, c三个矩阵
分别求出对应的h数组以及最大子矩阵,再在里面求出一个最大值即可。
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 1010; 9 char map[maxn][maxn];10 int h[3][maxn], l[3][maxn], r[3][maxn];11 12 int main(void)13 {14 #ifdef LOCAL15 freopen("2870in.txt", "r", stdin);16 #endif17 18 int row, col;19 while(scanf("%d%d", &row, &col) == 2)20 {21 int i, j, k, t;22 for(i = 0; i < row; ++i)23 scanf("%s", map[i]);24 memset(h, 0, sizeof(h));25 int ans = 0;26 for(i = 0; i < row; ++i)27 {28 for(j = 0; j < col; ++j)29 {30 switch(map[i][j])31 { //处理h数组32 case ‘a‘:33 ++h[0][j], h[1][j] = h[2][j] = 0;34 break;35 case ‘b‘:36 ++h[1][j], h[0][j] = h[2][j] = 0;37 break;38 case ‘c‘:39 ++h[2][j], h[0][j] = h[1][j] = 0;40 break;41 case ‘w‘:42 ++h[0][j], ++h[1][j], h[2][j] = 0;43 break;44 case ‘x‘:45 ++h[1][j], ++h[2][j], h[0][j] = 0;46 break;47 case ‘y‘:48 ++h[0][j], ++h[2][j], h[1][j] = 0;49 break;50 case ‘z‘:51 ++h[0][j]; ++h[1][j], ++h[2][j];52 }53 }54 l[0][0] = l[1][0] = l[2][0] = 0;55 r[0][col-1] = r[1][col-1] = r[2][col-1] = col-1;56 for(j = 1; j < col; ++j)57 for(k = 0; k < 3; ++k)58 {59 t = j;60 while(t > 0 && h[k][j] <= h[k][t-1])61 t = l[k][t-1];62 l[k][j] = t;63 }64 65 for(j = col-2; j >= 0; --j)66 for(k = 0; k < 3; ++k)67 {68 t = j;69 while(t < col-1 && h[k][j] <= h[k][t+1])70 t = r[k][t+1];71 r[k][j] = t;72 }73 74 for(j = 0; j < col; ++j)75 for(k = 0; k < 3; ++k)76 ans = max(ans, (r[k][j]-l[k][j]+1)*h[k][j]);77 }78 printf("%d\n", ans);79 }80 return 0;81 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。