最大子图形问题

CODEVS1159最大全0子矩阵

题目描述 Description

在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。

思路:这个题最朴素的n^6的算法,超时美美的。。。然后想优化,从一个点向上方、左方、右方扩展,首先更新这个点向上能有多少个0h0,然后找左右h比h0大的作为左右边界,然后计算这个矩形的面积,最后输出最大值。。。这种构造的美丽算法,真心。。。

比较: 最大全0子正方形:f[i][j](以i,j为右下角的最大正方形的边长)=min(f[i-1][j],f[i][j-1],f[i-1][j-1]),这里用了正方形的特性,所以和矩形的求法不同。
这属于dp中的重要分支,最大子图形问题,详细的讲解可以参考下面的网址。。。真心丧病。。。 
http://www.docin.com/p-46970779.html 

code:#include<iostream>#include<cstdio>using namespace std;int li[2001]={0},ri[2001]={0},hi[2001]={0},a[2001][2001]={0};int main(){int n,i,j,ans=0;scanf("%d",&n);for (i=1;i<=n;++i)for (j=1;j<=n;++j)scanf("%d",&a[i][j]);for (i=1;i<=n;++i){for (j=1;j<=n;++j){if (a[i][j]==0) ++hi[j];else hi[j]=0;li[j]=ri[j]=j;}for (j=2;j<=n;++j)if (a[i][j]==0)while (hi[li[j]-1]>=hi[j])li[j]=li[li[j]-1];for (j=n-1;j>=1;--j)if (a[i][j]==0)while (hi[ri[j]+1]>=hi[j])ri[j]=ri[ri[j]+1];for (j=1;j<=n;++j)if (a[i][j]==0)ans=max(ans,(ri[j]-li[j]+1)*hi[j]);}cout<<ans<<endl;}
RZUC Code

 

 

CODEVS1259最大正方形子矩阵

题目描述 Description

在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0。

 

思路:做了好几个有关的最大子阵的问题,发现还是有些困难,做这个题想了好久,发现其实很简单,利用全0子矩阵的思路和正方形的思路就可以比较简单的写出dp方程。预处理一个点上方hi,左方li和右方ri0的个数(不包含这个点本身)。

  f[i][j]=min(f[i-1][j-1]+1,min(li[i][j]+1,hi[i][j]+1))

第一个比较容易错的地方就来,每次对于能更新的f[i][j]的位置要求在map中为1,否则就不能构成要求的正方形;

其次就是题目中要求对角线为1,一个正方形有两条对角线,都应该考虑到,根据f数组的更新可以同理写出;

在预处理的时候细心,注意这个点和周围点的关系就可以了。

#include<iostream>
#include<cstdio>
using namespace std;
int map[1010][1010]={0},li[1010][1010]={0},ri[1010][1010]={0},hi[1010][1010]={0},f[1010][1010]={0},g[1010][1010]={0};
int main()
{int n,m,i,j,ans=0;cin>>n>>m;for (i=1;i<=n;++i){for (j=1;j<=m;++j){scanf("%d",&map[i][j]);hi[i][j]=hi[i-1][j];li[i][j]=li[i][j-1];if (map[i-1][j]==0) ++hi[i][j];else hi[i][j]=0;if (map[i][j-1]==0&&j>1) ++li[i][j];else li[i][j]=0; }for (j=m-1;j>=1;--j){ri[i][j]=ri[i][j+1];if (map[i][j+1]==0) ++ri[i][j];else ri[i][j]=0;}}for (i=1;i<=n;++i){for (j=1;j<=m;++j)if (map[i][j]==1){f[i][j]=min(f[i-1][j-1]+1,min(li[i][j]+1,hi[i][j]+1));if (f[i][j]>ans) ans=f[i][j];}for (j=m;j>=1;--j)if (map[i][j]==1){g[i][j]=min(g[i-1][j+1]+1,min(ri[i][j]+1,hi[i][j]+1));if (g[i][j]>ans)ans=g[i][j];}}cout<<ans<<endl;
}
RZUC Code

从网上看到了一个很全的子图形问题的Word,分享一下:http://www.docin.com/p-351795539.html

 

 

tyvj1563最大正方形

思路:这个题目很特殊,要求最大正方形中相邻两点的颜色不同,所以可以读图的时候进行处理,隔一个变一次(使这个位置上0、1互换),这样就转化成了矩阵中的最大全0或全1子正方形了,非常简单的dp解决

  f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;(全0,先判断map[i][j]=0) 全1同理;

最大子图形问题的众多变式都应能转化为基本的求正方形、矩形等问题,得以比较简单的解决。看来noip后要找时间好好研究了。。。

 

bzoj1057 棋盘制作

题目大意:求一个01交错的最大正方形和矩形面积。

思路:把(i+j)%2==0的位置0/1互换一下,就变成了求最大0/1子矩阵问题,正方形可以根据长宽中取较小作为边长就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxnode 2005
using namespace std;
int map[maxnode][maxnode]={0},hi[maxnode]={0},li[maxnode]={0},ri[maxnode]={0};
int fang(int x){return x*x;}
int main()
{int i,j,ans1=0,ans2=0,k,n,m;scanf("%d%d",&n,&m);for (i=1;i<=n;++i)for (j=1;j<=m;++j){scanf("%d",&map[i][j]);if ((i+j)%2) map[i][j]^=1;}for (k=0;k<=1;++k){memset(hi,0,sizeof(hi));for (i=1;i<=n;++i){for (j=1;j<=m;++j){if (map[i][j]==k) ++hi[j];else hi[j]=0;li[j]=ri[j]=j;if (j>1&&map[i][j]==k)while(hi[li[j]-1]>=hi[j]) li[j]=li[li[j]-1];}for (j=m-1;j>=1;--j)if (map[i][j]==k)while(hi[ri[j]+1]>=hi[j]) ri[j]=ri[ri[j]+1];for (j=1;j<=m;++j)if (map[i][j]==k){ans1=max(ans1,fang(min(hi[j],ri[j]-li[j]+1)));ans2=max(ans2,hi[j]*(ri[j]-li[j]+1));}}}printf("%d\n%d\n",ans1,ans2);
}
View Code

 

转载于:https://www.cnblogs.com/Rivendell/p/4076516.html

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

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

相关文章

UE4多线程

UE4中最基础的模型就是FRunnable和FRunnableThread&#xff0c;FRunnable抽象出一个可以执行在线程上的对象&#xff0c;而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRunnable UE4为我们抽象FRunnable的概念&#xff0c;让我们指定…

UE4异步编程专题 - 线程池FQueuedThreadPool

1. FQueuedThreadPool & IQueuedWork FQueuedThreadPool是UE4中抽象出的线程池。线程池由若干个Worker线程&#xff0c;和一个同步队列构成。UE4把同步队列执行的任务抽象为IQueuedWork. 线程池的同步队列&#xff0c;就是一个IQueuedWork的队列了。借用wiki上线程池的图,…

UE4异步编程专题 - 多线程

专题的第二篇&#xff0c;我们聊聊UE4中的多线程的基础设施。UE4中最基础的模型就是FRunnable和FRunnableThread&#xff0c;FRunnable抽象出一个可以执行在线程上的对象&#xff0c;而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRu…

坑爹的UICollectionView

最近用UICoolectionView的时候遇到一个很DT的问题&#xff0c;我往VC里加12个视图&#xff0c;结果显示成这样&#xff08;右边是期待的样子&#xff09;&#xff1a; 研究了一下午&#xff0c;终于发现了问题&#xff1a; interface FpLabelCell : UICollectionViewCellproper…

UE4异步编程专题 - TFunction

0. 关于这个专题 游戏要给用户良好的体验&#xff0c;都会尽可能的保证60帧或者更高的fps。一帧留给引擎的时间也不过16ms的时长&#xff0c;再除去渲染时间&#xff0c;留给引擎时间连10ms都不到&#xff0c;能做的事情是极其有限的。同步模式执行耗时的任务&#xff0c;时长…

UE4高级功能--初探超大无缝地图的实现LevelStream

LevelStream 实现超大无缝地图--官方文档学习 The Level Streaming feature makes it possible to load and unload map files into memory as well as toggle their visibility all during play. This makes it possible to have worlds broken up into smaller chunks so th…

inside uboot (二) 启动流程

1. S3C6410 启动流程 1). 6410上电后&#xff0c;首先执行片内iROM的程序&#xff08;BL0&#xff09;&#xff0c;初始化时钟和看门狗等外围器件。 2). 然后把flash中头4K&#xff08;BL1&#xff09;的内容加载到片内的SRAM中执行。 3). 在SRAM中执行的BL1&#xff0c;初始…

你理解我的意思么?

在最近一次的电话会议里, 某leader前后说了十来句, "你理解我的意思么?". 说实话, 有些我都没理解, 不过我听到的大家的答复都是"理解!", "明白!". Leader问这样的问题, 期望是得到对方给你反馈, 结果大部分人不会直接对上级说, "是的,我不…

inside uboot (三) 异常向量表

1. 异常向量表概述 从上面的地址映射来看&#xff0c;中断向量表的地址为0xD0037400&#xff0c;因此如果我们想在SRAM中&#xff0c;也就是BL1中处理异常的话&#xff0c; 就需要把我们的异常向量表拷贝到这个地址上。或者我们可以在链接脚本中直接指定代码的地址。 如果在主…

有关GNU GCC的基本内容整理

一、GCC简介 GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器集合&#xff09;是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子&#xff0c;由自由软件基金会 以GPL协议发布。当年Richard Stallman 刚开始写作 GCC 的时候&am…

[UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()

相关内容&#xff1a; C实现动态加载的问题&#xff1a;LoadClass<T>()和LoadObject<T>() http://aigo.iteye.com/blog/2281558C实现动态加载UObject&#xff1a;StaticLoadObject()&#xff1b;以Texture和Material为例 http://aigo.iteye.com/blog/2268056 这…

inside uboot (五) DRAM的构成

DRAM(Dynamic Random Access Memory)&#xff0c;即动态随机存取存储器. 1. Storage Cell 如上图&#xff0c;一个DRAM的基本存储单元由4个部分组成。 Storage Capacitor&#xff0c;即存储电容&#xff0c;它通过存储在其中的电荷的多和少&#xff0c;或者说电容两端电压差的…

使用json-lib进行Java和JSON之间的转换

转自http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库&#xff0c;提供将Java对象&#xff0c;包括beans, maps, collections, java arrays and XML等转换成JSON&#xff0c;或者反向转换的功能。 2. json-lib 主页 &#xff1a…

inside uboot (六) DRAM芯片的控制线及时序

Clock &#xff08;差分信号&#xff0c;CLK和nCLK&#xff09;为时钟信号 &#xff08;同一个rank共用&#xff09; CKE 时钟信号使能 &#xff08;同一个rank共用&#xff09; RAS 为行选…

MVC — 初步理解IIS工作流程

声明&#xff1a;本文只是自己的总结和积累。IIS7.x 目录 IIS流程及组成部分ASP.NET流程及组成部分IIS与ASP.NET MVC一、IIS流程及组成部分  1、Http.SYS&#xff1a;负责监听HTTP请求&#xff08;它不属于IIS范畴&#xff0c;但是和IIS联系紧密&#xff09; Http.SYS和IIS是…

卷积积分这样学!

卷积积分是一种数学运算&#xff0c;那么既然是数学运算&#xff0c;那么就得有数学的特性——定义、性质、定理。 本文将从卷积积分的理论、案例、求解方法、知识图谱四方面介绍卷积积分&#xff01; 一、【理论】卷积积分的理论 卷积积分定义&#xff1a; 卷积图解01 卷积…

世界地图并不是世界的真实样貌!甚至误差非常大

现在所用的世界地图并不是世界的真实样貌&#xff0c;甚至误差大的离谱。 地球属于三维球体&#xff0c;想完整地表现到二维平面上是不可能的&#xff0c;必须牺牲一些真实属性。因为三维降到二维肯定存在扭曲失真&#xff0c;这是维度差异所决定的&#xff0c;不可避免。 我们…

error MSB6006: cmd.exe exited with code 3

利用vs2012和qt5.5.1&#xff0c;在编译例子时发生如下错误&#xff1a; C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(172,5): error MSB6006: “cmd.exe”已退出&#xff0c;代码为 3。 图片如下&#xff1a; 解决办法如下&#x…

数学天才用5万字让你读懂:微积分!

前面接连发了三篇麦克斯韦方程组的文章&#xff08;积分篇、微分篇和电磁波篇&#xff09;&#xff0c;从理论上来说&#xff0c;讲麦克斯韦方程组不讲微积分是不行的&#xff0c;因为人家本来就是一组积分方程和一组微分方程。 但是&#xff0c;为了让更多人&#xff0c;尤其是…