[2007 AHOI]宝库通道 (Treasure Passage) 题解

题目描述

探宝的旅程仍然继续中,由于你的帮助,小可可成功点燃了灯阵,避过了许多致命的陷阱,终于来到了宫殿的正厅中。大厅的地面是由一块块大小一致的正方形石块组成的,这些石块分为黑、白两色,组成了一个 \(m\times n\) 的矩形,在其中一个石块的下面就是通往藏宝库的通道。小可可不可能一个一个石块的尝试,因为有些石块安装了机关,一碰就会触发,整个宫殿也随之倒塌。根据藏宝图记载,通道在某一特定的区域中,这个区域是一个由数个石块组成的面积不为 \(0\) 的小矩形,它的四条边与大厅地面的边平行。如果对整个大厅地面任意划分矩形,那么在所有矩形中,这个区域的黑色石块数目减去白色石块数目所得的差是最大的。

小可可希望和你分工,由他来选择区域,你来计算黑、白两色石块的数目差 \(s\)。这样就能快速而准确的确认通道所在的区域。藏宝图上说这个区域中的石块都没有安装机关,只要确定了区域,就一定能找到通道。宝藏就在眼前了,加油吧!

(假设用 1 表示黑色石块,用 0 表示白色石块)

输入格式

输入文件的第一行为两个整数 \(m,n\)
以下 \(m\) 行,每行 \(n\) 个字符,每个字符都是 01

输出格式

输出文件仅一个数,表示所有可能的区域中 \(s\) 值(见前文描述)最大的一个,输出这个值即可。

3 4
1011
1111
1111
10
4 5
10110
01111
11110
10101
8

数据规模与约定

  • 对于 \(50\%\) 的数据,\(1\le m,n\le 200\)
  • 对于 \(100\%\) 的数据,\(1\le m,n\le 400\)

题目大意

挺难理解的,仔细阅读后大意如下:

给定一个 \(n\)\(m\) 列的仅包含 01 的矩形,请求出区域内 1 的个数减去 0 的个数的最大值。

\(n,m\leq 400\)

思路分析

显然可以用二维前缀和维护,枚举所有区域,求出该区域的答案求 \(\max\) 即可。

具体地,我们先用二维前缀和 \(sum_{i,j}\) 求出前 \(i\) 行前 \(j\) 列的 1 的个数(也得到了 0 的个数),根据容斥原理,有通项公式:

\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum{i-1,j-1} \]

再枚举区域的左上角 \((u,l)\) 和右下角 \((d,r)\),该区域的答案为:

\[ans=sum[d][r]-sum[d][l-1]-sum[u-1][r]+sum[u-1][l-1] \]

这样,枚举 \(u,l,d,r\),时间复杂度显然为 \(\mathcal{O(n^4)}\),不能通过。

\(\texttt{50pts TLE code}\)

/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define QAQ cout<<"QAQ\n";
const int MAXN=4e2+5,inf=1e18,mod=1e9+7;
int sum[MAXN][MAXN];
int n,m,ans;
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char t;cin>>t;sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+t-'0';}}for(int u=1;u<=n;u++){for(int l=1;l<=m;l++){for(int d=u+1;d<=n;d++){for(int r=l+1;r<=m;r++){int s1=sum[d][r]-sum[d][l-1]-sum[u-1][r]+sum[u-1][l-1];int s0=(d-u+1)*(r-l+1)-s1;ans=max(ans,s1-s0);}}}}cout<<ans;return 0;
}

可以使用最大子段和来优化前缀和。我们对每一行求一个一维的前缀和,显然第 \(i\) 行前 \(j\) 个的通项公式为:

\[sum_{i,j}=sum_{i,j-1}+a_{i,j} \]

接着枚举区域,枚举区域的 \(l\)\(r\),求出区域内每一行的和 \(f_i\),接下来对和求最大子段和,为:

\[f_i=\max(f_i,f_{i-1}+f_i) \]

\(f_i\)\(\max\)

这样,时间复杂度进化为 \(\mathcal{O(n^3)}\),可以通过。

\(\texttt{code}\)

/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define QAQ cout<<"QAQ\n";
const int MAXN=4e2+5,inf=1e18,mod=1e9+7;
int n,m,ans=-inf;
int sum[MAXN][MAXN],f[MAXN];
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;sum[i][j]=sum[i][j-1]+(c=='1'?1:-1);}}for(int j1=1;j1<=m;j1++){for(int j2=j1;j2<=m;j2++){for(int i=1;i<=n;i++){f[i]=sum[i][j2]-sum[i][j1-1];}for(int i=1;i<=n;i++){f[i]=max(f[i],f[i-1]+f[i]);ans=max(ans,f[i]);}}}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872389.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Clickhouse】应用场景与原理剖析

ClickHouse起源于俄罗斯的Yandex公司。Yandex作为俄罗斯最大的搜索引擎公司,在处理和分析大规模用户行为数据、日志数据等方面积累了丰富的经验。为了满足自身对大数据分析和实时查询的需求,Yandex开发了ClickHouse这一在线分析处理(OLAP)的列式数据库管理系统。ClickHouse…

Unity使用Grpc

本文主要记录一下在使用unity接入grpc时的流程。开始之前说明一下环境:客户端:unity-2022.3,服务端:golang语言,go-zero框架。共分两步走,第一步实现protobuf的接入,第二步再接入grpc。 用到的demo.proto文件如下:点击查看代码 syntax = "proto3";package de…

python安装、vscode安装、conda安装:一文搞定Python的开发环境(史上最全)

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

一文搭建本地镜像仓

一文搭建本地镜像仓 拉取registry镜像 docker pull registry:2运行registry容器 第1种方式:不加持久化 docker run -d -p 5000:5000 --restart=always --name=registry registry:2第2种方式:对初始化配置文件,加持久化 # 创建数据卷,用于挂载 docker create volume registr…

全局锁和表锁

根据加锁的范围可以将锁分为全局锁、表级锁和行锁三类 全局锁 顾名思义,全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会…

使用 电报机器人 tele bot 下载视频资源到nas群晖上

本文章解决:通过tele 手机APP 远程执行群晖上的命令 、 tdl使用效果图步骤1.创建teleg 机器人,省略,自己去百度2.下载git项目 ,修改你的ADMIN_ID和token 并运行dockefile2.1 下载 https://github.com/aikunzhe/TeleShellBot2.2 获取ADMIN_ID,获取机器人token,修改conf…

python 利用探空数据识别整层云

选用蔡淼的论文:[1]蔡淼,欧建军,周毓荃,等.L波段探空判别云区方法的研究[J].大气科学,2014,38(02):213-222. 里面的阈值法: #!/usr/bin/python3 # -*- coding: utf-8 -*- """ @Time : 2025/1/20 23:22 @Author : Suyue @Email : 1493117872@qq.com @File : cl…

某Websocket反爬逆向分析+请求加解密+还原html

JS逆向分析Websocket,请求加解密,二进制消息解析网址 aHR0cHM6Ly93d3cueWR4Zi5nb3YuY24vTmV3cy9zaG93TGlzdC80L3BhZ2VfMS5odG1s 前言 工作中遇到的某websocket反爬,比混淆网站还恶心,看到也有其他人在问这个 之前看到其他大佬也弄过这个websocket反爬,但是只是说了下加解密…

Vulnhub DC-2

dc2Vulnhub DC-2 与DC1同样的思路,但是输ip跳转到dc-2,改host文件解决。 发现cms是WordPress。 得到flag1 Your usual wordlists probably won’t work, so instead, maybe you just need to be cewl.More passwords is always better, but sometimes you just can’t win th…

【PyTorch】使用回调和日志记录来监控模型训练

就像船长依赖仪器来保持航向一样,数据科学家需要回调和日志记录系统来监控和指导他们在PyTorch中的模型训练。 在本教程中,我们将指导您实现回调和日志记录功能,以成功训练模型。 一、理解回调和日志记录 回调和日志记录是PyTorch中有效管理和监控机器学习模型训练过程的基本…

TBtools的使用

转录本:由一条基因通过转录,由于可变剪切形成的一种或多种可供编码蛋白质的成熟mRNA。另外非编码RNA也可能有转录本的说法。 最长转录本:可变剪切一个基因得到多个序列长度不同的转录本,应选序列最长的进行数据分析。 CDS:蛋白质编码区,是与蛋白序列一一对应的DNA序列,不…

finalshell远程连接Centos虚拟机配置固定ip地址

为虚拟机Centos的远程连接软件Finalshell或者xshell等软件配置固定ip地址提示:然后全点确定,就好了,这里就不演示了输入指令vim /etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=static #将ip设置为静态IPADDR="192.168.142.130" #静态ip地址,这个130是在0…