hdu 4328 Cut the cake
2013-10-18 16:43
411 查看
悬线法。求解子矩阵的最大周长。子矩阵可以是单色的,也可以是两种颜色交错的。因为题目矩阵范围是1000,所以明显是悬线法。。。注意:考虑好把方格当做点和普通点的区别。给几组数据做测试用吧。。。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define CLR(a, b) memset(a, b, sizeof(a)) using namespace std; const int N = 1010; char G ; int L , R , H ; int l , r , n, m, ans; void Solve(char C) { int tmp; for(int i = 0; i < n; i ++) { tmp = -1; for(int j = 0; j < m; j ++) { if(G[i][j] == C) tmp = j; l[i][j] = tmp; }tmp = m; for(int j = m - 1; j >= 0; j --) { if(G[i][j] == C) tmp = j; r[i][j] = tmp; } } for(int j = 0; j < m; j ++) { if(G[0][j] == C) H[0][j] = 0; else H[0][j] = 1; L[0][j] = l[0][j]; R[0][j] = r[0][j]; } for(int i = 1; i < n; i ++) for(int j = 0; j < m; j ++) { if(G[i - 1][j] == C) { H[i][j] = 1; L[i][j] = l[i][j]; R[i][j] = r[i][j]; } else { H[i][j] = H[i - 1][j] + 1; L[i][j] = max(l[i][j], L[i - 1][j]); R[i][j] = min(r[i][j], R[i - 1][j]); } } for(int i = 0; i < n; i ++) { for(int j = 0; j < m; j ++) { if(R[i][j] - L[i][j] - 1 > 0) ans = max(ans, H[i][j] + (R[i][j] - L[i][j] - 1)); } } } void Solve2() { int tmp; for(int i = 0; i < n; i ++) { l[i][0] = 0;tmp = 0; for(int j = 1; j < m; j ++) { if(G[i][j] == G[i][j - 1]) tmp = j; l[i][j] = tmp; } r[i][m - 1] = tmp = m - 1; for(int j = m - 2; j >= 0; j --) { if(G[i][j] == G[i][j + 1]) tmp = j; r[i][j] = tmp; } } for(int j = 0; j < m; j ++) { H[0][j] = 1; L[0][j] = l[0][j]; R[0][j] = r[0][j]; } for(int i = 1; i < n; i ++) for(int j = 0; j < m; j ++) { if(G[i][j] == G[i - 1][j]) { H[i][j] = 1; L[i][j] = l[i][j]; R[i][j] = r[i][j]; } else { H[i][j] = H[i - 1][j] + 1; L[i][j] = max(l[i][j], L[i - 1][j]); R[i][j] = min(r[i][j], R[i - 1][j]); } } for(int i = 0; i < n; i ++) { for(int j = 0; j < m; j ++) { ans = max(ans, H[i][j] + (R[i][j] - L[i][j] + 1)); } } } int main() { //freopen("in.txt", "r", stdin); int t, cas = 1; scanf("%d", &t); while(t --) { scanf("%d%d", &n, &m); for(int i = 0; i < n; i ++) { scanf("%s", G[i]); }ans = 0; Solve('R');Solve('B'); Solve2(); printf("Case #%d: %d\n", cas ++, 2 * ans); } }
10 7 4 BBRB RBRB RRRR RRRB RRBB BRBB RBRB 4 1 B R B R 4 3 BBR BRB BBR RRB 3 1 R B B 5 4 RRBR BRRB RRRB RBRR RBBR 3 10 BRBRRBRRBB RRBRRBRRRB RBBBRRRRRB 5 3 RBR RBR RBB RBR RBR 6 4 RBBR BBBB RBRR BRRR BRRB RBRR 1 8 RBBBBRRB 2 1 B B Case #1: 10 Case #2: 10 Case #3: 12 Case #4: 6 Case #5: 8 Case #6: 12 Case #7: 12 Case #8: 10 Case #9: 10 Case #10: 6
相关文章推荐
- P1055 奶牛浴场 - Vijos
- 最大子矩阵和问题
- HDU 1081 最大子矩阵(求最大连续子序列和)
- POJ 1768 最大子矩阵
- [BZOJ1057][ZJOI2007]棋盘制作(极大子矩形)
- vijos 1055 奶牛浴场
- 51Nod-1158-全是1的最大子矩阵
- HDU-1505-City Game
- BZOJ 3039: 玉蟾宫|悬线dp
- HDU 4328 Cut the cake 最大相同子矩阵, 悬线法
- URAL 1146 Maximum Sum (最大子矩阵)
- HDU 4328 Cut the cake(最大子矩阵+悬线法)
- UVALive 3029 City Game(最大子矩阵+悬线法)
- LA 3029(悬线法)
- hdu 1081 To The Max(最大子矩阵)
- BZOJ 1057 ZJOI 2007 棋盘制作 DP+悬线法
- 给定一个矩阵,求和最大的子矩阵
- hdu - To The Max-1081 - 最大子矩阵 - 最大连续子序列和变形/动态规划
- HDU 1505(City Game)动态规划-最大矩阵
- linux cmdline解析过程说明