HDOJ4328-最大子矩阵,悬线法
2012-08-01 20:19
323 查看
/* 在我眼里,有好的算法模板代码来看学才是王道~ 此题没用单调队列(不熟,不知如何用是好),用的是悬线法求最大子矩阵 学习此法大牛们都推荐王知昆的论文,小cai我也推荐下,另外也推荐多搜几个代码,找个 好看的模仿模仿~ */ #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int NN=1002; int n,m,ans; bool g[NN][NN]; int l[NN][NN],r[NN][NN],h[NN][NN]; void dp(int c)//处理纯色块的情况 { memset(l,0,sizeof(l)); memset(h,0,sizeof(h)); memset(r,0,sizeof(r)); for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { if (g[i][j]==c) { h[i][j]=0; l[i][j]=0; } else { h[i][j]=h[i-1][j]+1; l[i][j]=l[i][j-1]+1; } } for (int j=m; j; j--) { if (g[i][j]==c) r[i][j]=0; else r[i][j]=r[i][j+1]+1; } } int _left,_right; for (int j=1; j<=m; j++)//列优先 { for (int i=1; i<=n; i++) { if (h[i][j]==1) { _left=l[i][j];//有那么点决策单调性的意味 _right=r[i][j]; } else { _left=min(_left,l[i][j]); _right=min(_right,r[i][j]); } ans=max(ans,(_right+_left-1)*2+h[i][j]*2); } } } void dp2()//处理交叉色块的情况 { memset(l,0,sizeof(l)); memset(h,0,sizeof(h)); memset(r,0,sizeof(r)); for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { if (g[i][j]==g[i-1][j]) h[i][j]=1; else h[i][j]=h[i-1][j]+1; if (g[i][j]==g[i][j-1]) l[i][j]=1; else l[i][j]=l[i][j-1]+1; } for (int j=m; j; j--) { if (g[i][j]==g[i][j+1]) r[i][j]=1; else r[i][j]=r[i][j+1]+1; } } int _left,_right; for (int j=1; j<=m; j++) { for (int i=1; i<=n; i++) { if (h[i][j]==1) { _left=l[i][j]; _right=r[i][j]; } else { _left=min(_left,l[i][j]); _right=min(_right,r[i][j]); } ans=max(ans,(_right+_left-1)*2+h[i][j]*2); } } } int main() { int T,cas=0; char st[NN]; scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) { scanf("%s",st); for (int j=0; j<m; j++) g[i][j+1]=(st[j]=='B'); } ans=4; dp(0); dp(1); dp2(); printf("Case #%d: %d\n",++cas,ans); } return 0; }
相关文章推荐
- hdoj 1559 最大子矩阵 [dp]
- hdoj.1559 最大子矩阵 20140813
- HDU 4328 Cut the cake 最大相同子矩阵, 悬线法
- 暑期dp46道(39)--HDOJ 2870 最大子矩阵面积...
- hdoj 4307 Matrix 【最大流 求解矩阵乘最值】【经典构图!】
- 暑期dp46道(40)--HDOJ 2830 最大子矩阵面积 额
- hdoj 1559 最大子矩阵 【矩阵压缩 DP】
- 最大子序列和以及最大矩阵和
- 2163 最大正方形子矩阵
- hdoj 4565 So Easy! 【矩阵快速幂】【构造矩阵好题】
- BZOJ-1084 最大子矩阵
- BZOJ 1084: [SCOI2005]最大子矩阵【DP】
- [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K
- 最大01子矩阵
- hdoj_1231&&hdoj_1003最大连续子序列
- UVA 10074 Take the Land(最大子矩阵和变形)
- 最大子矩阵面积
- Matlab中几种关于如何求矩阵最大值并返回其行列号的方法
- HDOJ 1024 Max Sum Plus Plus 最大K段子序列和(01背包 + 滑动数组 + 优化)
- HDOJ 4549 M斐波那契数列(矩阵快速幂 + 费马小定理)