最大子图形问题

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,一经查实,立即删除!

相关文章

仿真程序驱动视景问题

1. 坐标对应&#xff0c;东北天还是东南天 2. 跑道角度 3. 单位&#xff0c;厘米&#xff0c;米

Android--Facebook Login without LoginButton

1.引入facebook 工程lib&#xff0c;在Manifest中声明com.facebook.LoginActivity&#xff0c;facebook_app_id <activityandroid:name"com.facebook.LoginActivity"android:label"string/app_name"android:theme"android:style/Theme.Translucent…

【Direct3D游戏开发】——DirectInput 让世界动起来

其实我们是可以通过Windows消息和API取得键盘或者鼠标或者其他设备的输入信息&#xff0c;但这有个等待windows消息传送的延时&#xff0c;笔者试过直接在消息回调函数中相应键盘的上下左右消息去使场景中的模型进行旋转&#xff0c;感觉有明显的延时。这对于游戏玩家来说简直是…

UE4多线程

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

使用.net备份和还原数据库

使用.net备份和还原数据库 原文:使用.net备份和还原数据库CSDN网友的提问http://community.csdn.net/Expert/TopicView3.asp?id4929678C#实现SQLSERVER2000数据库备份还原的两种方法: 方法一&#xff08;不使用SQLDMO&#xff09;&#xff1a;//////备份方法///SqlConnection …

初识JavaScript,感觉整个人都不好了。。。

学习web前端的开发已经将近一个月了&#xff0c;开发中的三个大兄弟——“html”、“css”、“JavaScript”&#xff0c;小哥我已经深入接触了前两位&#xff0c;并与他俩建立的深厚的友谊。在编写过程中&#xff0c;不能说达到各位大神的程度&#xff0c;但是对各个标签、若干…

ue4-控制台执行方法

1. 引擎单例派生类可直接调用方法 以下类的派生类中可以通过在方法上标记 UFUNCTION(Exec) 直接调用方法 Pawns, Player Controllers, Player Input, Cheat Managers, Game Modes, Game Instances, overriden Game Engine classes, and Huds should all work by just adding t…

通过回调函数阻止进程创建(验证结束,方案完全可行)

&#xff08;此方案完全可行&#xff0c;只是我忘掉了一步&#xff09; 虽然Vista之后版本有进程创建回调函数的Ex版&#xff0c;而且Ex版可以拦截进程创建&#xff0c; 但是由于在Ex版回调函数内用第三个参数的最后一个元素来阻止进程创建的话&#xff0c;可能会出现弹框&…

UE4 多线程使用tip

在GameThread线程之外的其他线程中&#xff0c;不允许做一下事情 1. 不要 spawning / modifying / deleting UObjects / AActors 2. 不要使用定时器 TimerManager 3. 不要使用任何绘制接口&#xff0c;例如 DrawDebugLine 4. 如果想在主线程中异步处理&#xff08;也就是分帧…

linux shell if

linux_if 参数 shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指…

UE4异步操作总结

虚幻本身有提供一些对异步操作的封装&#xff0c;这里是对这段时间接触到的“非同步”的操作进行的总结。 当前使用的UE4版本为4.18.2。 在虚幻的游戏制作中&#xff0c;如果不是特殊情况一般不会有用到线程的时候。但是由于实际上虚幻内部是有着许多线程机制的。 例如通常的…

JavaScript模式读书笔记 第3章 字面量和构造函数

1&#xff0c;对象字面量 -1&#xff0c;Javascript中所创建的自定义对象在任务时候都是可变的。可以从一个空对象开始&#xff0c;根据需要增加函数。对象字面量模式可以使我们在创建对象的时候向其添加函数。<script>//定义空对象var dog {};//对空对象添加方法dog.na…

如何在UE4中创建线程

FRunnable和FRunnableThread方法对于大多数问题来说无疑是一个可行的解决方案。 但是&#xff0c;在创建许多任务时&#xff0c;您可能会达到CPU可以处理的并发上限&#xff0c;此时并发线程实际上会在争用CPU时间时相互阻碍。 然后可能值得查看FQueuedThreadPool以限制任务可用…

[Leveldb源码剖析疑问]-block_builder.cc之Add函数

Add函数是给一个Data block中添加对应的key和value,函数源码如下,其中有一处不理解: L30~L34是更新last_key_的,不理解这里干嘛不直接last_key_ key.ToString(); 写成 // Update state last_key_.resize(shared); last_key_.append(key.data() shared, non_shared); assert(S…

UE4多线程任务系统详解

首先&#xff0c;了解一下该系统重要的数据类型. 1. FQueuedThreadPool&#xff1a;虚基类&#xff0c;队列线程池, FQueuedThreadPoolBase继承自FQueuedThreadPool&#xff0c; FQueuedThreadPoolBase维护了一个TArray<IQueuedWork*> QueuedWork(需要被执行的工作)…

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;时长…

Python用subprocess的Popen来调用系统命令

当我们须要调用系统的命令的时候&#xff0c;最先考虑的os模块。用os.system()和os.popen()来进行操作。可是这两个命令过于简单&#xff0c;不能完毕一些复杂的操作&#xff0c;如给执行的命令提供输入或者读取命令的输出&#xff0c;推断该命令的执行状态&#xff0c;管理多个…