uvalive 3029 City Game
https://vjudge.net/problem/UVALive-3029
题意:
给出一个只含有F和R字母的矩阵,求出全部为F的面积最大的矩阵并且输出它的面积乘以3。
思路:
求面积最大的子矩阵,可以用扫描线。参考训练指南(orz,虽然并不知道为什么用扫描线)。
对于每一个格子包含F,我们可以把它向上拉成一条悬线,直到上面的格子为R,然后观察这条悬线可以扫到左边与右边的最大距离,那么我们所求的面积就是所有的悬线中 悬线的长度乘以(右边界 - 左边界 + 1)的最大值。
然后,需要计算悬线的长度,用up来表示,那么当这个格子为F时up(i,j) = up(i - 1,j) + 1(i >= 1),up(i,j) = 1,(i == 0);
当这个格子为R时,up(i,j) = 0。
然后,用left数组和right数组维护左右边界的信息:
我们假设lo是当前格子之前的最近的是R的格子,从左往右遍历,那么 lo 的初值是-1,那么当(i,j) 为 F时 ,left(i,j) = max(left(i-1,j),lo + 1),为什么呢,因为当前的悬线如果是包含上一行此列的格子的话,那么就要考虑上一行左边的情况了;
当(i,j)为R时,left(i,j) = 0。
维护右边界的信息同理,不同的是求最小值和从右往左遍历。
!!!:记住一边遍历,一边维护。输入也是坑!
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; char a[][];
int up[][],right[][],left[][]; int main()
{
int t; scanf("%d",&t); while(t--)
{
int m,n; memset(a,,sizeof(a));
memset(up,,sizeof(up));
memset(right,,sizeof(right));
memset(left,,sizeof(left)); scanf("%d%d",&m,&n); getchar(); for (int i = ;i < m;i++)
for (int j = ;j < n;j++)
{
char s; s = getchar(); while (s != 'R' && s != 'F') s = getchar(); if (s == 'R') a[i][j] = ;
else a[i][j] = ;
} /*for (int i= 0;i < m;i++)
{
for (int j = 0;j < n;j++) printf("%d",(int)a[i][j]); printf("\n");
}*/ int ans = ; for (int i = ;i < m;i++)
{
for (int j = ;j < n;j++)
{
if (i == )
{
up[i][j] = a[i][j];
}
else
{
if (a[i][j]) up[i][j] = up[i-][j] + ;
else up[i][j] = ;
}
} int lo = -,ro = n; if (i == )
{
for (int j = ;j < n;j++)
{
if (a[i][j] == ) left[i][j] = , lo = j;
else left[i][j] = lo + ;
} for (int j = n - ;j >= ;j--)
{
if (a[i][j] == ) right[i][j] = n, ro = j;
else right[i][j] = ro - ;
} for (int j = ;j < n;j++)
{
int tmp = up[i][j] * (right[i][j] - left[i][j] + ); ans = max(ans,tmp * );
}
}
else
{
for (int j = ;j < n;j++)
{
if (a[i][j] == ) left[i][j] = , lo = j;
else left[i][j] = max(lo + ,left[i-][j]);
} for (int j = n - ;j >= ;j--)
{
if (a[i][j] == ) right[i][j] = n, ro = j;
else right[i][j] = min(ro - ,right[i-][j]);
} for (int j = ;j < n;j++)
{
int tmp = up[i][j] * (right[i][j] - left[i][j] + ); ans = max(ans,tmp * );
}
}
} /*for (int i = 0;i < m;i++)
{
for (int j = 0;j < n;j++)
{
printf("%d %d %d\n",up[i][j],left[i][j],right[i][j]);
}
}*/ printf("%d\n",ans);
} return ;
}
uvalive 3029 City Game的更多相关文章
- 【UVALive】3029 City Game(悬线法)
题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include ...
- City Game UVALive - 3029(悬线法求最大子矩阵)
题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别 ...
- UVALive 6889 City Park 并查集
City Park 题目连接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=122283#problem/F Description P ...
- 并查集 - UVALive 6889 City Park
City Park Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129725 Mean: 在 ...
- LA 3029 City Game
LA 3029 求最大子矩阵问题,主要考虑枚举方法,直接枚举肯定是不行的,因为一个大矩阵的子矩阵个数是指数级的,因此应该考虑先进行枚举前的扫描工作. 使用left,right,up数组分别记录从i,j ...
- LA 3029 - City Game (简单扫描线)
题目链接 题意:给一个m*n的矩阵, 其中一些格子是空地(F), 其他是障碍(R).找一个全部由F 组成的面积最大的子矩阵, 输出其面积乘以3的结果. 思路:如果用枚举的方法,时间复杂度是O(m^2 ...
- UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- UVaLive 3695 City Game (扫描线)
题意:给定m*n的矩阵,有的是空地有的是墙,找出一个面积最大的子矩阵. 析:如果暴力,一定会超时的.我们可以使用扫描线,up[i][j] 表示从(i, j)向上可以到达的最高高度,left[i][j] ...
- UVaLive 6854 City (暴力)
题意:给定一个 n*m 的矩阵,表示有多少条道路与它相连,其中有一个-1,表示未知,道路只能横着和竖着,求-1处的值. 析:根据题意可知,一个点,与其他周围的四个点都可能相连的,也就是说肯定有共用道路 ...
随机推荐
- 用xml画水平虚线和竖直虚线.md
1.画水平虚线 直接建一个shape,设置stroke属性就行了,再将这个属性直接作为background的drawable属性引入就行了 注意在4.0以上的真机加一句 <?xml versio ...
- 基于dijkstra算法求地铁站最短路径以及打印出所有的路径
拓展dijkstra算法,实现利用vector存储多条路径: #include <iostream> #include <vector> #include <stack& ...
- maven 随笔
<build> <plugins> <!--打包源代码--> <plugin> <artifactId>maven-source-plugi ...
- 学习js函数--自执行函数
我在写代码时候经常会在tpl的<script>里写类似的代码: $(function(){ alert("我好饿"); }); 刚开始的时候只知道写了它不需要调用,直接 ...
- 移动端车牌识别ocr系统
移动端车牌识别ocr系统优点: 1.识别速度快:高度优化的车牌定位和识别算法,识别时间≤50毫秒(200万图片). 2.识别率:白天识别率≥99.7%:夜间识别率≥98%. 3.识别速度:单张图片识别 ...
- 有var和没有var的本质区别
我们创建一个变量: var a = 100: 同时,大家也知道,就是不写var关键字也可以创建.在很多教程和说法中,将没有var 的这个名称称之为“全局变量”.如果我在全局直接写一个var abc = ...
- C#设计模式(5)-建造者模式
引言 上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-抽象工厂模式,本篇将介绍建造者模式: 点击这里查看全部设计模式系列文章导航 建造者模式简介 建造者模式是将一个复杂对象的构建与表示分离, ...
- 用JS控制CSS基本样式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp29 用JS控制CSS基本样式的方法 CSS code .class1 { ...
- Nand Flash驱动(实现初始化以及读操作)
简单制作一个Nand Flash驱动(只需要初始化Flash以及读Flash) 打开2440芯片手册,K9F2G08U0M芯片手册(因为2440中Nand Flash是用的256MB(2Gb)内存,8 ...
- easyUI创建人员树
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用 项目中的树状下拉列表是用来选择人员用的,具体实现展示如下: 先说一说功能,左边的人员数是提供选人的,当点击中间的按钮,选中的人员会直接移到 ...