hdu 4328 cut the cake#单调队列#DP
2012-08-01 11:36
429 查看
/** 找最大的纯0 纯1 或01交叉的矩阵,01交叉的要是方阵 前两种单调栈或单调队列 第三种dp dp[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 1100 char s ; int mat ; int lef ,rig ,dp ; int m,n,hg[2] ; 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 4 RBRB BRBR RBRB BRBR 4 4 RRBR RBRB BRBR RBRB 5 5 BRRRR RRRBR BBRBR BRBRB BBRBR 10 8 BRBBBBBR RBRRRRRR BRBBBBBB RRRRRRRR RRRRRRRR RRBRBRBR BBRBRBRB RRBRBRBR BBRBRBRB RRBRBRBR 11 8 BRBBBBBR RBRRRRRR BRBBBBBB RRRRRRRR RRRRRRRR RRBRBRBR BBRBRBRB RRBRBRBR BBRBRBRB RRBRBRBR BBRBRBRB */
相关文章推荐
- hdu - 4328 - Cut the cake - dp
- HDU 4328 Cut the cake(DP)
- Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
- HDU 4328 - Cut the cake
- POJ-3017 Cut the Sequence(DP单调队列优化 + 平衡树)
- hdu 4328 Cut the cake
- hdu 4328 Cut the cake
- poj 3017 Cut the Sequence(DP+单调队列)
- Cut the Sequence,Sequence Partitioning,POJ3017,POJ3245,用单调队列优化的DP
- HDU 4328 Cut the cake(最大子矩阵+悬线法)
- hdu 4328 Cut the cake
- poj 3017 Cut the Sequence dp+单调队列优化
- POJ Cut the Sequence 单调队列优化DP入门题
- POJ 3017 Cut the Sequence 【DP+单调队列优化+平衡树】
- [HDU 4328] Cut the cake (悬链法)
- POJ - 3017 Cut the Sequence(单调队列+dp)
- POJ 3017 Cut the Sequence (单调队列优化DP)
- poj3017 Cut the Sequence 单调队列优化dp 好题!
- POJ 3017 Cut the Sequence(dp+单调队列)
- poj 3017 Cut the Sequence(dp单调队列优化)