zzuoj 10445: 魔法花园 【思维】
2016-04-10 11:34
351 查看
题目链接:zzuoj 10445: 魔法花园
10445: 魔法花园
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 55 Solved: 18
[Submit][Status][Web Board]
Description
身为魔法少女的一员,学姐(头还在哦)在最后一战之后便退隐了。她决定用她剩余的魔法去圈一块矩形花园。但是有一些土地会使学姐的魔法失效(即边不可以跨越这些土地)。现在学姐想知道在这块N*M的土地上她可以获得的最大花园面积。(单位格面积为1).在这块N*M的图中,”.”表示学姐可以施法,”X”表示会失效。(1<=N,M<=200)。
Input
输入为多组样例,第一行为N和M,下面N*M描述这个土地。
Output
输出多行,每行为麻美学姐可以获得的最大花园面积。
Sample Input
5 6
……
..X..X
X..X..
……
..X…
Sample Output
16
HINT
如上样例,假设麻美学姐的魔法为F,那么她圈地的方式是
.FFFF.
.FX.FX
XF.XF.
.FFFF.
..X…
思路:预处理每一行、列’.’字符的个数,显然当sum[r] - sum[l-1] = r - l + 1时说明不存在’X’。我们枚举行,然后从左到右推进列,记第一个合法列为左边界l,继续向右推进,若存在行不合法则初始化左边界l,反之若列合法更新右边界r,在这个过程中维护最大矩形。
AC代码:
10445: 魔法花园
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 55 Solved: 18
[Submit][Status][Web Board]
Description
身为魔法少女的一员,学姐(头还在哦)在最后一战之后便退隐了。她决定用她剩余的魔法去圈一块矩形花园。但是有一些土地会使学姐的魔法失效(即边不可以跨越这些土地)。现在学姐想知道在这块N*M的土地上她可以获得的最大花园面积。(单位格面积为1).在这块N*M的图中,”.”表示学姐可以施法,”X”表示会失效。(1<=N,M<=200)。
Input
输入为多组样例,第一行为N和M,下面N*M描述这个土地。
Output
输出多行,每行为麻美学姐可以获得的最大花园面积。
Sample Input
5 6
……
..X..X
X..X..
……
..X…
Sample Output
16
HINT
如上样例,假设麻美学姐的魔法为F,那么她圈地的方式是
.FFFF.
.FX.FX
XF.XF.
.FFFF.
..X…
思路:预处理每一行、列’.’字符的个数,显然当sum[r] - sum[l-1] = r - l + 1时说明不存在’X’。我们枚举行,然后从左到右推进列,记第一个合法列为左边界l,继续向右推进,若存在行不合法则初始化左边界l,反之若列合法更新右边界r,在这个过程中维护最大矩形。
AC代码:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> #include <cmath> #include <stack> #include <map> #include <vector> #include <cstdlib> #define fi first #define se second #define ll o<<1 #define rr o<<1|1 #define CLR(a, b) memset(a, (b), sizeof(a)) using namespace std; typedef long long LL; typedef pair<int, int> pii; const int MOD = 1e9 + 7; const int MAXN = 100; const int INF = 1e9 + 10; void add(LL &x, LL y) { x += y; x %= MOD; } char str[210]; int cul[210][210], row[210][210]; bool jrow(int l, int r, int k) { return row[k][r] - row[k][l-1] == r - l + 1; } bool jcul(int l, int r, int k) { return cul[r][k] - cul[l-1][k] == r - l + 1; } int main() { int n, m; while(scanf("%d%d", &n, &m) != EOF) { CLR(cul, 0); CLR(row, 0); for(int i = 1; i <= n; i++) { scanf("%s", str+1); for(int j = 1; j <= m; j++) { if(i == 1) { cul[i][j] = (str[j] == '.'); } else { cul[i][j] = cul[i-1][j] + (str[j] == '.'); } } for(int j = 1; j <= m; j++) { if(j == 1) { row[i][j] = (str[j] == '.'); } else { row[i][j] = row[i][j-1] + (str[j] == '.'); } } } int ans = 0; for(int i = 1; i <= n; i++) { for(int j = i; j <= n; j++) { int l = -1, r = -1; for(int k = 1; k <= m; k++) { if(l == -1) { if(jcul(i, j, k)) { l = r = k; ans = max(ans, j - i + 1); } } else { if(!jrow(l, k, i) || !jrow(l, k, j)) { l = -1; r = -1; } else if(jcul(i, j, k)) { r = k; ans = max(ans, (j - i + 1) * (r - l + 1)); } } } if(l != -1) { ans = max(ans, (j - i + 1) * (r - l + 1)); } } } printf("%d\n", ans); } return 0; }
相关文章推荐
- 从校招时间谈大学求职准备
- Android模仿发说说 完美版 无bug 可以本地获取相机,相册 删除,点击进入滑动 ui更新
- iOS开发数据库篇—SQLite简单介绍
- MAMP下安装phpredis扩展(微原创)
- zzuoj 10452: "分"数 【dp】
- leetcode 10 Regular Expression Matching
- Oracle ,My SQL 与SQL Server的区别
- 【机房合作】——总结
- zzuoj 10459: Tutti! 【最小费用最大流】
- dual表
- LAMP服务的搭建
- 抽象类和接口
- 一道古老的分赃题之我见
- mapreduce(JAVA)实现(大数据)电话号码对应的流量排序(倒序)
- memcache在大型网站的应用策略
- POJ 3159 Candies(SPFA+栈)差分约束
- 复利计算-做汉堡,结对2.0
- 推荐《天才在左,疯子在右》
- Calling C and C++ from IDL (一)
- zzuoj 10456: 最长匹配子串 【思维】