标签:des style blog http io ar os java for
2009 Multi-University Training Contest 7 - Host by FZU
题目大意:有个字母矩阵,包含字母"a、b、c、w、x、y、z",其中,w能变为"a、b",
x能变为"b、c",y能变为"a、c",z能变为"a、b、c"。问能构成的最大字母完全一样的子
矩阵面积为多大?
思路:和HDU1505、HDU1506一样的思路,其中a[i][j]表示转换为字母a后以第i行为底,
第j列上方连续空闲位置的高度。b[i][j]表示字母b……,c[i][j]表示字母c……
遍历计算出该点向左右两边延伸的左右边界,从而计算出面积,最终比较计算出最大面积。
参考博文:HDU1505http://blog.csdn.net/lianai911/article/details/40302489
HDU1506http://blog.csdn.net/lianai911/article/details/40208265
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[1100][1100],b[1100][1100],c[1100][1100],l[1100],r[1100]; int main() { int M,N; char ch; while(~scanf("%d%d",&M,&N)) { for(int i = 1; i <= M; i++) { getchar(); for(int j = 1; j <= N; j++) { scanf("%c",&ch); if(ch=='a' || ch=='w' || ch=='y' || ch=='z') a[i][j] = a[i-1][j] + 1; else a[i][j] = 0; if(ch=='b' || ch=='w' || ch=='x' || ch=='z') b[i][j] = b[i-1][j] + 1; else b[i][j] = 0; if(ch=='c' || ch=='x' || ch=='y' || ch=='z') c[i][j] = c[i-1][j] + 1; else c[i][j] = 0; } } int area = -0xffffff0; for(int i = 1; i <= M; i++) { // ------------------求a最大面积--------------- l[0] = 1,r[N+1] = N; a[i][0] = a[i][N+1] = -1; for(int j = 1; j <= N; j++) { l[j] = j; while(a[i][l[j]-1] >= a[i][j]) l[j] = l[l[j]-1]; } for(int j = N; j >= 1; j--) { r[j] = j; while(a[i][r[j]+1] >= a[i][j]) r[j] = r[r[j]+1]; } for(int j = 1; j <= N; j++) { if(a[i][j] * (r[j]-l[j]+1) > area) area = a[i][j] * (r[j]-l[j]+1); } // ----------------求b最大面积---------------- l[0] = 1,r[N+1] = N; b[i][0] = b[i][N+1] = -1; for(int j = 1; j <= N; j++) { l[j] = j; while(b[i][l[j]-1] >= b[i][j]) l[j] = l[l[j]-1]; } for(int j = N; j >= 1; j--) { r[j] = j; while(b[i][r[j]+1] >= b[i][j]) r[j] = r[r[j]+1]; } for(int j = 1; j <= N; j++) { if(b[i][j] * (r[j]-l[j]+1) > area) area = b[i][j] * (r[j]-l[j]+1); } // -------------求c最大面积--------------- l[0] = 1,r[N+1] = N; c[i][0] = c[i][N+1] = -1; for(int j = 1; j <= N; j++) { l[j] = j; while(c[i][l[j]-1] >= c[i][j]) l[j] = l[l[j]-1]; } for(int j = N; j >= 1; j--) { r[j] = j; while(c[i][r[j]+1] >= c[i][j]) r[j] = r[r[j]+1]; } for(int j = 1; j <= N; j++) { if(c[i][j] * (r[j]-l[j]+1) > area) area = c[i][j] * (r[j]-l[j]+1); } } printf("%d\n",area); } return 0; }
HDU2870_Largest Submatrix【最大完全子矩阵】
标签:des style blog http io ar os java for
原文地址:http://blog.csdn.net/lianai911/article/details/40787757