hdu 4328 cut the cake#单调队列#DP
来源:互联网 发布:小非农数据几点公布 编辑:程序博客网 时间:2024/06/05 19:30
/**找最大的纯0 纯1 或01交叉的矩阵,01交叉的要是方阵前两种单调栈或单调队列第三种dpdp[i][j] = min(dp[i][j-1],dp[i-1][j]) + (mat[i][j] == mat[i-k][j-k])*/#include <stdio.h>#include <iostream>#include <string.h>using namespace std;#define N 1100char s[N][N];int mat[N][N];int lef[N],rig[N],dp[N][N];int m,n,hg[2][N];int f(int flag){ memset(hg,0,sizeof(hg)); int j; int cur,pre,tmp,res = 0; for(int i = 1; i <= n; ++i) { cur = (i & 1); pre = !cur; for(j = 1; j <= m; ++j) if(mat[i][j] == flag) hg[cur][j] = hg[pre][j] + 1; else hg[cur][j] = 0; for(j = 1; j <= m; ++j) lef[j] = rig[j] = j; for(j = 2; j <= m; ++j) while(lef[j] > 1 && hg[cur][j] <= hg[cur][lef[j]-1]) lef[j] = lef[lef[j]-1]; for(j = m - 1; j; --j) while(rig[j] < m && hg[cur][j] <= hg[cur][rig[j]+1]) rig[j] = rig[rig[j]+1]; for(j = 1; j <= m; ++j) { if(hg[cur][j] == 0)///这让我想说卧槽~~~,疏忽鸟,作死WA continue; tmp = (rig[j] - lef[j] + 1 + hg[cur][j]) * 2; if(tmp > res) res = tmp; } } return res ;}int dd(){ int i,j,ans = 1; for(i = 1; i <= n; ++i) dp[i][1] = 1; for(j = 1; j <= m; ++j) dp[1][j] = 1; for(i = 2; i <= n; ++i) for(j = 2; j <= m; ++j) { if(mat[i][j-1] != mat[i-1][j] || mat[i][j] == mat[i-1][j] || mat[i][j] == mat[i][j-1]) dp[i][j] = 1; else { int k = dp[i][j] = min(dp[i-1][j],dp[i][j-1]); if(mat[i][j] == mat[i-k][j-k]) ++dp[i][j]; } ans = max(ans,dp[i][j]); } return ans * 4;}int main(){ int t,j,i; scanf("%d",&t); int cas = 0; char ss; while(t--) { scanf("%d%d",&n,&m); for(i = 1; i <= n; ++i) for(j = 1; j <= m; ++j) { cin >> ss; mat[i][j] = (ss == 'R'); s[i-1][j-1] = ss; } int ans = max(f(1),f(0)); ans = max(ans,dd()); printf("Case #%d: %d\n",++cas,ans); } return 0;}/*4 4RBRBBRBRRBRBBRBR4 4RRBRRBRBBRBRRBRB5 5BRRRRRRRBRBBRBRBRBRBBBRBR10 8BRBBBBBRRBRRRRRRBRBBBBBBRRRRRRRRRRRRRRRRRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRBRRBRBRBR11 8BRBBBBBRRBRRRRRRBRBBBBBBRRRRRRRRRRRRRRRRRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRBRRBRBRBRBBRBRBRB*/