护林员盖房子

百练 2019信科研究生上机测试 A

总时间限制:

1000ms

内存限制:

65536kB

描述

在一片保护林中,护林员想要盖一座房子来居住,但他不能砍伐任何树木。 
现在请你帮他计算:保护林中所能用来盖房子的矩形空地的最大面积。

输入

保护林用一个二维矩阵来表示,长宽都不超过20(即<=20)。 
第一行是两个正整数m,n,表示矩阵有m行n列。 
然后是m行,每行n个整数,用1代表树木,用0表示空地。

输出

一个正整数,表示保护林中能用来盖房子的最大矩形空地面积。

样例输入

4 5
0 1 0 1 1
0 1 0 0 1
0 0 0 0 0
0 1 1 0 1

样例输出

5

提示

子矩阵边长可以为1,也就是说: 
0 0 0 0 0 
依然是一个可以盖房子的子矩阵。

思路

和最大子矩阵和有共同之处。首先计算每一行的每个元素(为结束)的左侧有多少棵树。然后算出来的遍历矩阵,计算以该位置为矩阵右下角,向上回溯的过程中width和height的乘积最大值。

而最大子矩阵和是以遍历原矩阵n*m的列(1~n)首尾的所有可能,把这些列的元素相加成一个1*n的向量,再计算最大子段和。

最大子段和/最大子矩阵和传送门:https://blog.csdn.net/coderwait/article/details/89676714

#include<stdio.h>
#include<memory.h>
const int size = 21;
int max(int a, int b){return a>b?a:b;
}
int min(int a,int b){return a>b?b:a;
}
int main(void)
{int m,n;int a[size][size];memset(a,0,sizeof(a));scanf("%d%d",&m,&n);for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){scanf("%d",&a[i][j]);}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(a[i][j]==0) a[i][j]=a[i][j-1]+1;else a[i][j]=0;}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){printf("%d",a[i][j]);}printf("\n");}int ans = 0;int width; //遍历每一个位置,向上回溯的方式,求以该位置为最下角的树群的最大值 for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(a[i][j]!=0){//如果是树,跳过 width=a[i][j];//设置为当前的宽度 ans = max(ans,width*1);for(int k=i-1;k>=1;k--){if(a[k][j]==0){//如果搜到树,则说明不用再往上了break;}else{//如果没有搜到树,更新宽度,继续进行 width = min(width,a[k][j]);//printf("宽度:%d 高度:%d\n",width,(i-k+1)); ans = max(ans,width*(i-k+1));//注意别搞成负数 }}}}} printf("%d\n",ans);return 0;} /*4 5
0 1 0 0 1
0 1 0 0 1
0 0 0 0 0
0 1 0 0 1*/

【百练】护林员盖房子相关推荐

  1. 算法练习 护林员盖房子

    声明:没有OJ能跑,代码仅供思路参考,如有疑问,欢迎一起讨论 题目来源:百练2019信科研究生上机测试 题目:A:护林员盖房子 总时间限制: 1000ms 内存限制: 65536kB 描述 在一片保护 ...

  2. 算法题:护林员盖房子(C++)

    准备机试时发现有的学校不能用java,为保险只好把C++再翻出来.后来又发现有的学校不能用VS?只能再把Dev C++翻出来. ------------------------------------ ...

  3. 程序员多久才能在北京买房子?百练OJ:4022:买房子

    百练OJ:4022:买房子 题目链接:4022:买房子 描述 某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年 ...

  4. 百练(十三~十六)题解

    百练(十三) Bailian2806 公共子序列[最长公共子序列+DP] - 海岛Blog - CSDN博客 Bailian3143 验证"歌德巴赫猜想"[筛选法]_海岛Blog- ...

  5. Python入门习题(69)——OpenJudge百练习题:买房子

    OpenJudge百练第4022号习题:买房子 题目描述 解题思路 参考答案 测试用例 小结 题目描述 来源 OpenJudge网站 – 百练习题集-第4022号习题 要求 总时间限制: 1000ms ...

  6. 百练,4103,踩方格

    百练,4103,踩方格 普通做法:(也可以找规律) #include #include//要调用memset函数,头文件 using namespace std; int visited[50][50 ...

  7. 未来,机器人帮你盖房子

    近年,智能机器人应用日趋广泛和深入.种种迹象表明,"机器人革命"已经来临,人类社会正加速进入一个高度自动化的新时代. 去年9月,碧桂园宣布正式进军机器人领域,重点攻关建筑机器人.服 ...

  8. 通过细胞自动机,AI在「我的世界」学会了盖房子

    子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 了解游戏「我的世界(MineCraft)」的读者,一定很熟悉这样的画面. △图源:Science Magazine 但是,如果盖房子的不是人 ...

  9. 北大OJ百练——4075:矩阵旋转(C语言)

    百练的这道题很简单,通过率也达到了86%,所以我也就来贴个代码了...下面是题目: 不过还是说一下我的思路: 这道题对一个新来说,可能是会和矩阵的转置相混淆,这题并不是要我们去求矩阵的转置. 这题,我 ...

最新文章

  1. 「杂谈」如何系统性地学习生成对抗网络GAN
  2. Battery Historian 使用常用命令
  3. eclipse使用tomcat进行部署时编译代码不一致的处理
  4. Android --- 两种设置字体加粗的方法
  5. 【数据结构与算法】之深入解析“灯泡开关”的求解思路与算法示例
  6. 访百度奥运logo设计师李兴钢:虚实之间最美的呈现
  7. oracle触发器不允许修改数据库,Oracle数据库使用触发器记录表数据修改记录
  8. c语言分配内存空间方法,C语言之动态分配内存空间
  9. hdu 1525 Euclid‘s Game
  10. ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式
  11. 关闭IOS更新功能(ios4/5/6)
  12. 强悍的命令行 —— 磁盘空间的查看与磁盘空间的释放
  13. pythonindex函数输出字符首次出现位置_返回指定的字符串首次出现的位置
  14. html页面内容的收缩和展开效果
  15. linux 学习决心书
  16. java 消息推送的几种方式比较
  17. 如何在手机APP中通过H5方式集成监控摄像头实时直播画面
  18. 【C语言】一文带你简单了解C语言
  19. JVM和操作系统的关系是什么?
  20. jupyter的安装步骤

热门文章

  1. selenium设置浏览器的大小和位置
  2. Springboot中引入本地jar包,并通过maven打包(解决maven丢包的问题)
  3. MSP430通过IAR下载时出现的Failed to load debugee: C:\XX\XXIAR\Release\Exe\Wireless measurement.txt无法下载程序的问题
  4. HTML结构及常用的标签
  5. 豆腐的做法与编辑的文风
  6. HBase启动成功,但不能访问Web页面
  7. VS2019使用EasyX实现简单图形界面功能
  8. 定位首款弹幕K歌软件 阿里鲸鸣未来究竟能够走多远?
  9. 云数据库有什么用?有了云服务器为什么还要云数据库?
  10. 手机打电话提示无法连接到移动网络