【BZOJ-30391057】玉蟾宫棋盘制作 悬线法
3039: 玉蟾宫
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 753 Solved: 444
[Submit][Status][Discuss]
Description
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
Input
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
Output
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
Sample Input
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
Sample Output
HINT
对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000
Source
Poetize4
1057: [ZJOI2007]棋盘制作
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 2379 Solved: 1185
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 0 1
0 1 0
1 0 0
Sample Output
6
HINT
N, M ≤ 2000
Source
Solution
悬线法求最大子矩形 讲解
BZOJ3039玉蟾宫 就是裸的悬线法
BZOJ1057棋盘制作:
由于要求符合黑白染色的最大子矩形。 直接求显然非常麻烦,但是我们考虑对问题进行转化。
如果我们将原矩阵的黑白染色,另黑点0/1全部反转。那么我们求一个满足的最大子矩阵就相当于求一个最大的全0/1子矩阵(思考一下还是很容易想到的)
这样我们悬线法两次即可。
另一个问题就是最大子正方形。 考虑最大子正方形一定是包含在某个有效的极大子矩形中的,所以我们把所有的有效的极大子矩形中的长宽的较短边取一个最大,那么最大子正方形一定是这个长度的平方
Code
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int N,M,a[1010][1010],l[1010][1010],r[1010][1010],h[1010][1010],ans; char c[1]; int main() {scanf("%d%d",&N,&M);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)scanf("%s",c),a[i][j]=c[0]=='F';for (int i=1; i<=N; i++){for (int j=1,x=0; j<=M; j++)if (a[i][j]) l[i][j]=x; else l[i][j]=0,x=j;for (int j=M,x=M+1; j>=1; j--)if (a[i][j]) r[i][j]=x; else r[i][j]=M+1,x=j;}for (int i=1; i<=M+1; i++) r[0][i]=M+1;for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (a[i][j])h[i][j]=h[i-1][j]+1,l[i][j]=max(l[i][j]+1,l[i-1][j]),r[i][j]=min(r[i][j]-1,r[i-1][j]);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (a[i][j]) ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]);printf("%d\n",ans*3);return 0; }
BZOJ-3039
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAXN 2010 int N,M,a[MAXN][MAXN],l[MAXN][MAXN],r[MAXN][MAXN],h[MAXN][MAXN],ans,x; int main() {scanf("%d%d",&N,&M);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)scanf("%d",&a[i][j]);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if ((i+j)&1) a[i][j]^=1;for (int i=1; i<=N; i++){for (int j=1,x=0; j<=M; j++)if (a[i][j]) l[i][j]=x; else l[i][j]=0,x=j;for (int j=M,x=M+1; j>=1; j--)if (a[i][j]) r[i][j]=x; else r[i][j]=M+1,x=j;}for (int i=1; i<=M+1; i++) r[0][i]=M+1;for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (a[i][j])h[i][j]=h[i-1][j]+1,l[i][j]=max(l[i][j]+1,l[i-1][j]),r[i][j]=min(r[i][j]-1,r[i-1][j]);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (a[i][j]) ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]),x=max(x,min((r[i][j]-l[i][j]+1),h[i][j]));memset(h,0,sizeof(h));for (int i=1; i<=N; i++){for (int j=1,x=0; j<=M; j++)if (!a[i][j]) l[i][j]=x; else l[i][j]=0,x=j;for (int j=M,x=M+1; j>=1; j--)if (!a[i][j]) r[i][j]=x; else r[i][j]=M+1,x=j;}for (int i=1; i<=M+1; i++) r[0][i]=M+1;for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (!a[i][j])h[i][j]=h[i-1][j]+1,l[i][j]=max(l[i][j]+1,l[i-1][j]),r[i][j]=min(r[i][j]-1,r[i-1][j]);for (int i=1; i<=N; i++)for (int j=1; j<=M; j++)if (!a[i][j]) ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]),x=max(x,min((r[i][j]-l[i][j]+1),h[i][j]));printf("%d\n%d\n",x*x,ans);return 0; }
BZOJ-1057
水题就不一一发了......
转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5910280.html
【BZOJ-30391057】玉蟾宫棋盘制作 悬线法相关推荐
- [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...
- 洛谷-P1169 棋盘制作(悬线法)
国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 8 × 8 8×8 8×8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳 ...
- 洛谷P1169 棋盘制作(悬线法)
题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...
- 洛谷 P4147 玉蟾宫 题解【悬线dp】
原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...
- BZOJ 3039: 玉蟾宫( 悬线法 )
最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...
- bzoj 1057: 棋盘制作(悬线法)
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2311 Solved: 1146 [Submit][St ...
- BZOJ[3039]玉蟾宫 悬线法
题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=3039 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山 ...
- 洛谷 P4147 玉蟾宫【悬线法/单调栈】
题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N×MN\times MN×M ...
- [P4147 玉蟾宫(悬线法)
题目链接: P4147 玉蟾宫 题目大意: n ∗ m n∗m n∗m的矩阵,求最大的全 F F F矩阵面积 ∗ 3 *3 ∗3. 思路:悬线法. 参考代码: #include <bits/st ...
最新文章
- 什么是SAP HANA Database Procedure(数据库过程)
- iphone中使用第三方工具(RegexKitLite)实现正则表达式
- IOS scrollView 知识点
- C4D立体素材|旅游度假主题海报,设计点睛之笔
- Spring Cloud构建微服务架构—服务网关过滤器
- oracle请求界面,Oracle EBS如何enable 请求界面 View XML按钮
- springboot开发微信公众号(一)创建、查询、删除菜单(附源码)
- 读书笔记之财报就像一本故事书
- hp打印机装不上服务器系统,win10安装不了惠普打印机驱动怎么办
- Github上最热门的Java开源项目
- 系统的x86与x64是什么意思以及他们的区别?
- SQL 视图 简记
- 台式计算机用u盘给电脑安装系统,台式机用u盘装系统 电脑店给台式机装系统详细教程...
- android手电筒的源代码,Android,求打开手电筒最简练的代码
- “天下文章一大抄”的时代已经过去
- linux挂载img镜像文件,如何挂载.img格式的镜像
- 设计一个有利于A股东的配股方案
- java人民币大小写转换_人民币大小写转换
- Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
- 怎么设计出来的网站才更好看