【HDOJ】4328 Cut the cake

将原问题转化为求完全由1组成的最大子矩阵。
挺经典的通过dp将n^3转化为n^2。

  1 /* 4328 */
  2 #include <iostream>
  3 #include <sstream>
  4 #include <string>
  5 #include <map>
  6 #include <queue>
  7 #include <set>
  8 #include <stack>
  9 #include <vector>
 10 #include <deque>
 11 #include <algorithm>
 12 #include <cstdio>
 13 #include <cmath>
 14 #include <ctime>
 15 #include <cstring>
 16 #include <climits>
 17 #include <cctype>
 18 #include <cassert>
 19 #include <functional>
 20 #include <iterator>
 21 #include <iomanip>
 22 using namespace std;
 23 //#pragma comment(linker,"/STACK:102400000,1024000")
 24
 25 #define sti                set<int>
 26 #define stpii            set<pair<int, int> >
 27 #define mpii            map<int,int>
 28 #define vi                vector<int>
 29 #define pii                pair<int,int>
 30 #define vpii            vector<pair<int,int> >
 31 #define rep(i, a, n)     for (int i=a;i<n;++i)
 32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 33 #define clr                clear
 34 #define pb                 push_back
 35 #define mp                 make_pair
 36 #define fir                first
 37 #define sec                second
 38 #define all(x)             (x).begin(),(x).end()
 39 #define SZ(x)             ((int)(x).size())
 40 #define lson            l, mid, rt<<1
 41 #define rson            mid+1, r, rt<<1|1
 42
 43 const int maxn = 1005;
 44 char s[maxn][maxn];
 45 int a[maxn][maxn];
 46 int L[maxn][maxn], R[maxn][maxn], T[maxn][maxn];
 47 int n, m;
 48
 49 int calc() {
 50     int ret = 0;
 51
 52     rep(j, 0, m+1) {
 53         T[0][j] = 0;
 54         L[0][j] = 1;
 55         R[0][j] = m;
 56     }
 57
 58     rep(i, 1, n+1) {
 59         int l;
 60         l = 0;
 61         rep(j, 1, m+1) {
 62             if (a[i][j] == 1) {
 63                 T[i][j] = T[i-1][j] + 1;
 64                 L[i][j] = max(L[i-1][j], l+1);
 65             } else {
 66                 T[i][j] = 0;
 67                 L[i][j] = 1;
 68                 l = j;
 69             }
 70         }
 71
 72         int r;
 73         r = m + 1;
 74         per(j, 1, m+1) {
 75             if (a[i][j] == 1) {
 76                 R[i][j] = min(R[i-1][j], r-1);
 77             } else {
 78                 R[i][j] = m;
 79                 r = j;
 80             }
 81         }
 82
 83         rep(j, 1, m+1) {
 84             if (a[i][j]) {
 85                 int h = T[i][j];
 86                 int w = R[i][j] - L[i][j] + 1;
 87                 ret = max(ret, w+h);
 88             }
 89         }
 90     }
 91
 92     return ret << 1;
 93 }
 94
 95 void solve() {
 96     int ans = 0, tmp;
 97
 98     // blue
 99     rep(i, 1, n+1)
100         rep(j, 1, m+1)
101             a[i][j] = s[i][j] == ‘B‘;
102     tmp = calc();
103     ans = max(ans, tmp);
104
105     // red
106     rep(i, 1, n+1)
107         rep(j, 1, m+1)
108             a[i][j] = s[i][j] == ‘R‘;
109     tmp = calc();
110     ans = max(ans, tmp);
111
112     rep(i, 1, n+1) {
113         rep(j, 1, m+1) {
114             if ((i+j) & 1) {
115                 a[i][j] = s[i][j]!=‘R‘;
116             } else {
117                 a[i][j] = s[i][j]==‘R‘;
118             }
119         }
120     }
121     tmp = calc();
122     ans = max(ans, tmp);
123
124     rep(i, 1, n+1) {
125         rep(j, 1, m+1) {
126             if ((i+j) & 1) {
127                 a[i][j] = s[i][j]==‘R‘;
128             } else {
129                 a[i][j] = s[i][j]!=‘R‘;
130             }
131         }
132     }
133     tmp = calc();
134     ans = max(ans, tmp);
135
136     printf("%d\n", ans);
137 }
138
139 int main() {
140     ios::sync_with_stdio(false);
141     #ifndef ONLINE_JUDGE
142         freopen("data.in", "r", stdin);
143         freopen("data.out", "w", stdout);
144     #endif
145
146     int t;
147
148     scanf("%d", &t);
149     rep(tt, 1, t+1) {
150         scanf("%d %d", &n, &m);
151         rep(i, 1, n+1)
152             scanf("%s", s[i]+1);
153         printf("Case #%d: ", tt);
154         solve();
155     }
156
157     #ifndef ONLINE_JUDGE
158         printf("time = %d.\n", (int)clock());
159     #endif
160
161     return 0;
162 }

数据生成器。

 1 from copy import deepcopy
 2 from random import randint, shuffle
 3 import shutil
 4 import string
 5
 6
 7 def GenDataIn():
 8     with open("data.in", "w") as fout:
 9         t = 10
10         bound = 10**18
11         op = "RB"
12         fout.write("%d\n" % (t))
13         for tt in xrange(t):
14             n = randint(100, 1000)
15             m = randint(100, 1000)
16             fout.write("%d %d\n" % (n, m))
17             for i in xrange(n):
18                 line = ""
19                 for j in xrange(m):
20                     idx = randint(0, 1)
21                     line += op[idx]
22                 fout.write("%s\n" % (line))
23
24
25 def MovDataIn():
26     desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
27     shutil.copyfile("data.in", desFileName)
28
29
30 if __name__ == "__main__":
31     GenDataIn()
32     MovDataIn()
时间: 2024-08-01 10:44:41

【HDOJ】4328 Cut the cake的相关文章

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t

【HDOJ】2425 Hiking Trip

优先级队列+BFS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 25 8 9 typedef struct node_st { 10 int x, y, t; 11 node_st() {} 12 node_st(int xx, int yy, int tt)

【HDOJ】1686 Oulipo

kmp算法. 1 #include <cstdio> 2 #include <cstring> 3 4 char src[10005], des[1000005]; 5 int next[10005], total; 6 7 void kmp(char des[], char src[]){ 8 int ld = strlen(des); 9 int ls = strlen(src); 10 int i, j; 11 12 total = i = j = 0; 13 while (

【HDOJ】2795 Billboard

线段树.注意h范围(小于等于n). 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXN 200005 5 #define lson l, mid, rt<<1 6 #define rson mid+1, r, rt<<1|1 7 #define mymax(x, y) (x>y) ? x:y 8 9 int nums[MAXN<<2]; 10 int h, w; 11 12