HDU 2870 Largest Submatrix

来源:互联网 发布:网络文案岗位职责 编辑:程序博客网 时间:2024/04/27 17:50

嗯,题意也很容易理解,让求最大子矩阵,但是有几个字母是可以改变其值的,和前面1505又不一样,算是它的变形吧,没有做过前面两道题的推荐先看一下, 然后再做这个就会感觉简单很多……囧,我是这样做的!嘿嘿

嗯,可以把这个矩阵变成三个不同的矩阵(分别是a,b,c)然后按照1505题的思路做它就OK了!当然如果不会1505的话,可以先做1506

如果1506也没有思路,好吧,你可以看别人的报告了!嘿嘿。。。。。



#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 1010#define Max(a,b) (a>b?a:b)char map[N][N];int set[N][N];int l[N],r[N];__int64 ans;int n,m;void dp(int cur){int i;for(i=1;i<=m;i++)l[i] = r[i] = i;for(i=1;i<=m;i++){while(set[cur][l[i]-1] >= set[cur][i])l[i] = l[l[i]-1];}for(i=m;i>=1;i--){while(set[cur][r[i]+1] >= set[cur][i])r[i] = r[r[i]+1];}for(i=1;i<=m;i++)ans = Max(ans,set[cur][i]*(r[i] - l[i] +1));return ;}void dp_init(){int i;for(i=1;i<=n;i++)if(set[i+1][0] == -2)dp(i);return ;}void solve(char ch){int i,j;//memset(set,0,sizeof(set));set[n+1][0] = -2;for(i=1;i<=n;i++){set[i][0]=-1;for(j=1;j<=m;j++){if(map[i][j] == ch)set[i][j] = set[i-1][j] +1;else if(ch == 'a'){if(map[i][j] == 'w' || map[i][j] == 'y' || map[i][j] == 'z')set[i][j] = set[i-1][j] +1;else {set[i][0] = -2;set[i][j] = 0;}}else if(ch == 'b'){if(map[i][j] == 'w' || map[i][j] == 'x' || map[i][j] == 'z')set[i][j] = set[i-1][j] +1;else {set[i][0] = -2;set[i][j] = 0;}}else if(ch == 'c'){if(map[i][j] == 'x' || map[i][j] == 'y' || map[i][j] == 'z')set[i][j] = set[i-1][j] +1;else {set[i][0] = -2;set[i][j] = 0;}}}set[i][j] = -1;}dp_init();return ;}int main(){int i;while(~scanf("%d%d",&n,&m)){for(i=1;i<=n;i++)scanf("%s",map[i]+1);ans = 0;solve('a');solve('b');solve('c');printf("%I64d\n",ans);}return 0;}


原创粉丝点击