uvalive3209City Game

简介: 题意:给定一个m*n的矩阵,其中一些个字是空地(F),其他是障碍(R)。找出一个全部由F组成的面积最大的矩阵,输出其面积的3倍。 分析:简单暴力枚举,O(m3*n3),肯定不行。对于某一块F,设up[i][j]表示其上方的空地个数(就像一条悬线),zl[i][j]表示悬线能往左边走到的边界线的坐标...

题意:给定一个m*n的矩阵,其中一些个字是空地(F),其他是障碍(R)。找出一个全部由F组成的面积最大的矩阵,输出其面积的3倍。

分析:简单暴力枚举,O(m3*n3),肯定不行。对于某一块F,设up[i][j]表示其上方的空地个数(就像一条悬线),zl[i][j]表示悬线能往左边走到的边界线的坐标,zr[i][j]表示悬线能往右边走到的边界的坐标,那么面积s=(zr[i][j]-zl[i][j]+1)*up[i][j], zl从左到右枚举可以算出,zr则是从右到左枚举,状态转移是:zl[i][j]=max(zl[i-1][j], lo+1), lo表示第i行中第j列左边的最近障碍物的列编号, zr与之类似,max换成min即可

代码:

View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 #define DEBUG
 5 int max(int a, int b){
 6     return a>b?a:b;
 7 }
 8 int min(int a, int b){
 9     return a<b?a:b;
10 }
11 const int MAXN = 1000 + 10;
12 int mat[MAXN][MAXN], zl[MAXN][MAXN], zr[MAXN][MAXN], up[MAXN][MAXN];
13 int main(){
14 #ifndef DEBUG
15     freopen("in.txt", "r", stdin);
16 #endif
17     int cas;
18     scanf("%d", &cas);
19     while(cas--){
20         int m, n, i, j;
21         scanf("%d%d", &m, &n);
22         for(i=0; i<m; i++){
23             for(j=0; j<n; j++){
24                 int ch = getchar();
25                 while(ch!='F' && ch!='R') ch=getchar();
26                 if(ch=='F') mat[i][j]=0;
27                 else mat[i][j]=1;
28             }
29         }
30         int ans=0;
31         for(i=0; i<m; i++){
32             int lo=-1, ro=n;
33             for(j=0; j<n; j++){
34                 if(mat[i][j]==1){
35                     zl[i][j]=up[i][j]=0;
36                     lo=j;
37                 }else{
38                     if(i==0){
39                         up[i][j]=1;
40                         zl[i][j]=lo+1;
41                     }else{
42                         up[i][j]=up[i-1][j]+1;
43                         zl[i][j]=max(zl[i-1][j], lo+1);
44                     }
45                 }
46             }
47             for(j=n-1; j>=0; j--){
48                 if(mat[i][j]==1){
49                     zr[i][j]=n;
50                     ro=j;
51                 }else{
52                     if(i==0) zr[i][j]=ro-1;
53                     else zr[i][j]=min(zr[i-1][j], ro-1);
54                     ans=max(ans, up[i][j]*(zr[i][j]-zl[i][j]+1));
55                 }
56             }
57         }
58         printf("%d\n", ans*3);
59     }
60     return 0;
61 }
62 
63                     
64                     
65                     

 

目录
相关文章
|
10月前
|
缓存 安全 Java
如何在Java中实现多线程编程
Java多线程编程有三种主要方式:继承Thread类、实现Runnable接口、实现Callable接口(结合Future获取结果),推荐使用Runnable避免单继承限制。通过线程池(如ExecutorService)可高效管理线程,提升性能。多线程共享资源时需注意线程安全,使用synchronized或Lock机制保证数据一致性。适用于并发执行、异步计算等场景。
642 1
|
存储 缓存 Apache
Apache Iceberg数据湖高级特性及性能调优
性能调优涵盖索引优化、排序策略与元数据管理。通过布隆过滤器、位图索引等提升查询效率,结合文件内/间排序优化I/O与压缩,辅以Z-Order实现多维数据聚集。同时,合理配置元数据缓存与清单合并,加速查询规划。适用于点查、全表扫描及高并发写入场景,显著提升系统性能与资源利用率。
1169 0
|
SQL 数据库 Android开发
Android 访问系统相册选中图片,并返回该图片的路径
Android 访问系统相册选中图片,并返回该图片的路径
748 0
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
846 1
|
弹性计算
阿里云账号注册流程图文详解、账户实名认证和申请免费服务器全流程
阿里云账号注册支持手机号、支付宝等验证方式。使用手机号需手动验证,而支付宝等可自动完成实名认证。注册后须进行个人或企业实名认证才能正常使用服务。个人认证推荐使用支付宝快速完成;企业认证也支持支付宝法人扫描完成。完成认证后,可在免费中心申请最长达3个月的免费服务器试用,或选择付费方案获得更多资源。
|
安全 网络协议 网络安全
百度搜索:蓝易云【445端口是啥?445端口怎么关闭?】
请注意,在关闭445端口之前,确保您了解并考虑了可能的影响。关闭SMB服务或阻止445端口可能会影响与其他计算机或网络资源的连接和共享。在做出更改之前,请确保您理解其影响,并根据实际需求和安全要求来进行操作。
789 0
|
存储 人工智能 搜索推荐
浅谈归并排序:合并 K 个升序链表的归并解法
在面试中遇到了这道题:如何实现多个升序链表的合并。这是 LeetCode 上的一道原题,题目具体如下:
265 0
浅谈归并排序:合并 K 个升序链表的归并解法
|
数据采集 监控 搜索推荐
谁才是物联网连接技术中的王者?
本文介绍了物联网连接技术的现状,分析各个细分领域的佼佼者或者王者。
谁才是物联网连接技术中的王者?
|
存储 弹性计算 安全
新冠病毒药物研发分秒必争,阿里高性能计算如何出力?
新冠状病毒疫情发生后,为了帮助抗攻击疫情,阿里云免费向全球公共科研机构提供高性能计算、SCC超级计算集群和CPU/GPU机器、云超算及AI等技术。 近期,不少研究机构和高校在阿里云上E-HPC云超算上进行药物研发相关的数值计算,阿里云超算团队提供了技术支持与跟进。 本文主要介绍药物筛选阶段,E-HPC云超算如何帮助研发人员实现大量小分子库的快速并发处理。同时,介绍全球健康药物研发中心GHDDI算力和成果共享开放平台的阿里云解决方案。
6040 0
新冠病毒药物研发分秒必争,阿里高性能计算如何出力?

热门文章

最新文章