示例一:

输入  :

1 2

01

输出:

0

示例二:

输入  :

1 3

101

输出:

1

示例三(自己自测找错误用的):

输入  :

6 6
100111
111011
111111
111111
111111
101111

输出:

16

题意:在由1和0构成的矩形中找到由仅由1构成的第二大的矩形。(前缀和思维)

解题思路:(1)这是比赛后看别人代码的解法,比赛中自己也有这思路,但没考虑周到。运用前缀和思想算出每个位置前面到这个位置一共有多少个连续的1,然后从左上角开始往下算,每次记录当前位置的长度和位置(位置后面用来计算矩形的高度),每次算出当前最大矩形的大小和次大矩形的大小,更新答案。

(2)dfs,感觉自己剪枝做得不够好所以一直超时,还没想出如何不超时的剪枝方法,先留着,复杂度为O(N³),通过率为95%。

不说了,贴代码:

(1)AC代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=;///a数组记录每个位置的前缀和,max_1和max_2为最大和次大
char ss[maxn][maxn];
struct node
{
int num,ins;
}pp[maxn];///记录当前位置的长度和位置
void update(int summ)///更新最大值和次大值
{
if(summ>max_1){
swap(max_1,max_2);swap(summ,max_1);
}
else if(summ>max_2)swap(summ,max_2);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%s",ss[i]);
for(int i=;i<=n;i++){
for(int j=;j<m;j++){
if(ss[i][j]=='')a[i][j+]==;
else if(ss[i][j]=='')a[i][j+]=a[i][j]+;
}
}
for(int j=; j<=m; j++)
{
int r=;
for(int i=; i<=n; i++)
{
int book=i;
while(r&&pp[r].num>a[i][j]){
update((i-pp[r].ins)*pp[r].num);
update((i-pp[r].ins-)*pp[r].num);
book=min(book,pp[r].ins);
r--;
}
pp[++r]={a[i][j],book};
}
while(r){
update(((n+)-pp[r].ins)*pp[r].num);
update(((n+)-pp[r].ins-)*pp[r].num);
r--;
}
}
printf("%d\n",max_2);
return ;
}

(2)有剪枝通过的大佬教我一下

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=,t;///a数组记录每个位置的前缀和,max_1和max_2为最大和次大
int jlen=,ilen=,rec;///用于记录最小长度,最高高度和当前面积
char ss[maxn][maxn];
void dfs(int x,int y)
{
if(a[x][y])
{
if(a[x][y]>=jlen)
{
ilen++;
rec=ilen*jlen;
if(rec>max_1){
swap(max_1,max_2);swap(rec,max_1);}
else if(rec>max_2)
swap(rec,max_2);
dfs(x-,y);
}
else if(a[x][y]<jlen)
{
ilen++,jlen=a[x][y];
rec=ilen*jlen;
if(rec>max_1)
t=max_1,max_1=rec,max_2=t;
else if(rec>max_2)
max_2=rec;
dfs(x-,y);
}
}
return;
}
int main()
{
int n,m,x,book=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++){
scanf("%s",ss[i]);
for(int j=; j<m; j++)
{
if(j==&&ss[i][]=='')
a[i][]=,book++;
else if(ss[i][j]=='')
a[i][j+]=;
else if(ss[i][j]=='')
a[i][j+]=a[i][j]+,book++;
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
if(a[i][j])
{
ilen=,jlen=a[i][j];
rec=ilen*jlen;
if(rec>max_1)
t=max_1,max_1=rec,max_2=t;
else if(rec>max_2)
max_2=rec;
dfs(i-,j);
}
}
}
printf("%d\n",max_2);
return ;
}

(3)上面代码改进深搜极限918msAC(PS:试了横着做和竖着做,发现就只有竖着做能A,可能数据太弱的缘故吧)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn],max_1=,max_2=;
int rec;
int main()
{
int n,m,x,book=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
scanf("%1d",&a[i][j]);
a[i][j]+=a[i-][j]*a[i][j];
}
for(int i=n; i>=; i--)
{
for(int j=m; j>=; j--)
{
if(i*j<=max_2)break;
int ilen=a[i][j],jlen=;
while(ilen)
{
rec=ilen*jlen;
if(rec>=max_1)
max_2=max_1,max_1=rec;
else if(rec>max_2)
max_2=rec;
ilen=min(ilen,a[i][j-jlen]);
jlen++;
}
}
}
printf("%d\n",max_2);
return ;
}

2019牛客暑期多校训练营(第二场)H Second Large Rectangle的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学

    LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...

  3. 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论

    LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...

  4. 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路

    LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...

  5. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  6. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  7. 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP

    LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...

  8. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  9. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  10. 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论

    LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...

随机推荐

  1. ent 基本使用四 图遍历查询

    接上文,我们已经创建了基本的关系以及表实体,以下是通过图方式的查询 参考关系图 代码处理 创建图数据 func CreateGraph(ctx context.Context, client *ent ...

  2. ES6 - 开篇

    一些关于es6简单的介绍与了解.初始认知有限,循序完善. ES6: 又叫ES2015,是2015年推出的JavaScript新版本. 相应的,后边推出的ES7.8.9.10等都依次是上一版本发出后一年 ...

  3. IDE 问题及解决

    目录 Eclipse 篇 1.MarketPlace 打不开,对话框闪退 2.使用 lombok ,预编译不通过 3.Eclipse + PyDev - > Unresolved import: ...

  4. BootStrap-select组件

    正文 前言:之前分享过两篇bootstrap下拉框的组件:JS组件系列——两种bootstrap multiselect组件大比拼  和 JS组件系列——Bootstrap Select2组件使用小结 ...

  5. 20190815网络与信息安全领域专项赛线上赛misc WriteUp

    目录 签到题 题目内容 使用工具 解题步骤 七代目 题目下载地址 使用工具 解题步骤 亚萨西 题目下载链接 使用工具 解题步骤 24word 题目下载链接 使用工具 解题步骤 感想 几星期前报了名却完 ...

  6. Object changed by Unknown

    https://documentation.red-gate.com/soc7/troubleshooting/object-changed-by-unknown https://documentat ...

  7. exception: TypeError: Cannot read property '_modulesNamespaceMap' of undefined at getModuleByNamespac

    用 Vue.extend 创造的组件构造器和组件,默认是不集成 store 和 router 的. 比如 main.js 中的这个,其实是挂载在根组件 vm 中.并不是注入到全局 Vue 中.所以你用 ...

  8. Sketch2Code - Transform sketches into HTML using AI

    Sketch2Code - Transform sketches into HTML using AI https://sketch2code.azurewebsites.net/generated- ...

  9. sumdoc t411 dir.txt

    C:\Users\zhoufeiyue\Documents\sumdoc t411\(9+条消息)redis Jedis存取list对象和map - shenjianxz的博客 - CSDN博客.mh ...

  10. VUE-013-为elementUI 设置 tootip 宽度

    在表格显示列表中,通常添加 :show-overflow-tooltip="true" 以显示不能完全展示的单元格文案提示.单通常显示为全屏宽度,不易查看,可通过设置全局的样式,进 ...