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的更多相关文章

  1. 【UVALive】3029 City Game(悬线法)

    题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include ...

  2. City Game UVALive - 3029(悬线法求最大子矩阵)

    题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别 ...

  3. UVALive 6889 City Park 并查集

    City Park 题目连接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=122283#problem/F Description P ...

  4. 并查集 - UVALive 6889 City Park

    City Park Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129725 Mean: 在 ...

  5. LA 3029 City Game

    LA 3029 求最大子矩阵问题,主要考虑枚举方法,直接枚举肯定是不行的,因为一个大矩阵的子矩阵个数是指数级的,因此应该考虑先进行枚举前的扫描工作. 使用left,right,up数组分别记录从i,j ...

  6. LA 3029 - City Game (简单扫描线)

    题目链接 题意:给一个m*n的矩阵, 其中一些格子是空地(F), 其他是障碍(R).找一个全部由F 组成的面积最大的子矩阵, 输出其面积乘以3的结果. 思路:如果用枚举的方法,时间复杂度是O(m^2 ...

  7. UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  8. UVaLive 3695 City Game (扫描线)

    题意:给定m*n的矩阵,有的是空地有的是墙,找出一个面积最大的子矩阵. 析:如果暴力,一定会超时的.我们可以使用扫描线,up[i][j] 表示从(i, j)向上可以到达的最高高度,left[i][j] ...

  9. UVaLive 6854 City (暴力)

    题意:给定一个 n*m 的矩阵,表示有多少条道路与它相连,其中有一个-1,表示未知,道路只能横着和竖着,求-1处的值. 析:根据题意可知,一个点,与其他周围的四个点都可能相连的,也就是说肯定有共用道路 ...

随机推荐

  1. TTL转MIPI DSI芯片方案TC358778XBG

    型号:TC358778XBG功能:TTL转MIPI DSI通信方式:IIC分辨率:1920*1080电源:3.3/1.8/1.2封装形式:BGA80深圳长期现货 ,提供技术支持,样品申请及规格书请联系 ...

  2. Dapper获取连接类

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  3. c语言中的文件格式化读写函数fscanf和fprintf函数

    很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有.下面我将讲解一下fscanf和fprintf的强大 ...

  4. C# 实现AOP 的几种常见方式

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获 ...

  5. poj3723 MST好题 kruskal

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

  6. nginx小问题

    配置nginx与ftp图片服务器:安装后,要在/usr/local/nginx/conf/nginx.conf里面的server中(带有localhost的那一块)修改为location \ {roo ...

  7. C# yield return用法

    本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...

  8. 关于selenium IDE找不到元素

    selenium IDE ,明明存在元素,却找不到元素 ,报错Element not found 标签: seleniumselenium IDE自动化测试ide 2016-10-31 13:25 1 ...

  9. MyEclipse安装步骤和破解

    Myeclipse的安装步骤 MyEclipse简介: MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用 ...

  10. 个人作业3——(Alpha阶段)

    一.alpha 过程总结 1.这学期的软件工程作业,由于各种事情冲突和时间安排问题,前期并没有太多时间去好好应对,中途有很多次都想放弃.但最后还是咬咬牙在同学的帮助下完成了一些基本任务,在这门课程开始 ...