题目链接:点击查看

题目大意:给出k块m*n大小的土地,每块土地由数字‘0’或26个大写字母组成,大写字母代表住户,数字‘0’代表空地,现在开发商想尽可能多的修建大楼,每个大楼需要占用h*w的面积,而且每块土地最多只能修一栋大楼,不过住户不太愿意搬迁,经过协商后,住户答应在每块土地上,可以出售掉同一个住户的所有房屋,不过在其他土地上就不允许再购买该住户的房屋了,问在此条件下,开发商最多可以建造多少栋大楼

题目分析:题目有点复杂,但理解之后就变得相当简单了,因为每块土地开发商都可以选择买掉任一住户的所有房屋,以此来增加空地的可用面积,所以每一块土地可以看做一个顶点,每一个字母(住户),也可以看做一个顶点,因为每一个住户只在一块土地上出售房屋,所以就形成了一个一一对应的关系,简单来说,就是一个二分图匹配问题,即以每块土地来选择特定的字母,进而达到最大值的一个过程

这样一来只要建好图,然后跑一遍匈牙利算法就好了,我感觉难就难在该如何建图上,一开始实在没有思路,参考了一下zx学长的代码之后,就豁然开朗了,我们可以用二维前缀和来判断,因为题目规定了每个大楼需要占掉h*w面积的土地,并且暗示出这个h*w的面积必须是h*w,而不能是w*h,这样一来我们只需要在空地或当前字母上,取值为1,否则取值为0,求一下二维前缀和,然后判断哪一块h*w大小的区间内的值是h*w即可

这样建完图后,还有一个小细节需要注意一下,若某块土地中,空地的大小已经满足建大楼的需求,也就是说在当前土地并不需要购买用户的房屋时,直接让答案+1即可,剩下的跑一遍匈牙利就好了

现在看zx学长的代码看多了,代码风格和学长的风格越来越像了,但水平好像还是不如zx学长的十分之一QAQ

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=55;int k,n,m,h,w;char s[N][N];bool maze[N][N];//maze[k][character]int match[N];int sum[N][N];bool vis[N];bool cal(char ch)
{for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='0'||s[i][j]==ch)sum[i][j]=1;elsesum[i][j]=0;sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];if(i>=h&&j>=w&&sum[i][j]-sum[i-h][j]-sum[i][j-w]+sum[i-h][j-w]==h*w)return true;}}return false;
}bool dfs(int x)
{for(int i=1;i<=26;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(!match[i]||dfs(match[i])){match[i]=x;return true;}}} return false;
}int main()
{
//  freopen("input.txt","r",stdin);int t;cin>>t;while(t--){memset(match,0,sizeof(match));scanf("%d%d%d%d%d",&k,&n,&m,&h,&w);for(int i=1;i<=k;i++){for(int j=1;j<=n;j++)scanf("%s",s[j]+1);for(int j=0;j<=26;j++){char ch=j+'A'-1;maze[i][j]=cal(ch);}}int ans=0;for(int i=1;i<=k;i++){memset(vis,false,sizeof(vis));if(maze[i][0]||dfs(i))ans++;}printf("%d\n",ans);}return 0;
}

POJ - 1358 Housing Complexes(二分图最大匹配)相关推荐

  1. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

  2. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  3. POJ 1325 Machine Schedule(二分图最小点集覆盖)

    题目链接:http://poj.org/problem?id=1325 题意:A机器有n个模式,B机器有m个模式,有k个任务,第i个任务可以用A机器的ai模式或者B机器的bi模式,换模式需要重启,开始 ...

  4. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  5. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  6. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  7. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  8. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  9. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

最新文章

  1. 中国17种稀土有啥军事用途?没它们,美军技术优势将归零
  2. mysql索引与优化
  3. 定时自动刷新网页在线工具分享
  4. 最长子段和 11061008 谢子鸣
  5. IBatisNet1.5学习--配置篇
  6. 分布式系统Lease机制
  7. win10图标变白纸_超详细的纯净版win10安装教程,手把手教你学会,小白秒变大神!...
  8. 超越 EfficientNet与MobileNetV3,NeurIPS 2020 微软NAS方向最新研究
  9. c语言数字排列和算法思路,冒泡排序、快速排序算法理解及C程序实现
  10. java小球游戏项目实战
  11. python要学多久可以找到工作-学习Python多久能找到工作?老男孩Python开发培训
  12. HTML 空格转义符的用法
  13. 蔬菜大棚原理_温室大棚的原理是什么?
  14. 《潮流时装设计——世界顶级时装CAD制板技巧》——1.2 国内外服装CAD的发展状况...
  15. 网吧网管新人对无盘技术不熟
  16. UEFI Shell编程和使用
  17. Swift是花拳绣腿吗?——谈谈开发语言与程序员的职业发展
  18. excel表格末尾添加一行_七夕表白,用Excel试试!抖音爆红,一晚点赞破百万
  19. 计算机网络统考outlook操作视频,网络教育计算机统考Outlook
  20. 通过配置光猫路由器实现家用主机远程桌面连接

热门文章

  1. Nacos源码服务发现
  2. SpringSecurity OAuth2介绍
  3. Dubbo的终端操作方法
  4. MyBatis 插件原理与自定义插件-PageHelper 原理
  5. maven依赖管理的概念
  6. 哪些情况不适合建索引
  7. 使用Stream流的方式,遍历集合,对集合中的数据进行过滤
  8. springboot No Java compiler available for configuration options compilerClassName
  9. Base64编码 - Java加密与安全
  10. vivado 验证ddr引脚_vivado下ddr3的读写和测试详解