http://codewaysky.sinaapp.com/problem.php?id=1056

这题和奶牛浴场略有区别,奶牛浴场只需要求出最大子矩形,而这题要求的是最大权重子矩形,不一定要最大的面积,但要最大的权重和

思路是先求出每个最大子矩形,然后求出每个矩形的左上点和右下点,然后用二维数转数组进行求和,保存最优解

View Code

  1 #include<iostream>
  2 #include<string>
  3 #include<algorithm>
  4 #include<stdio.h>
  5 #include<memory.h>
  6 using namespace std;
  7
  8 int sum[1010][1010];
  9 int v[1010][1010];
 10 int l[1010],r[1010],h[1010];
 11 int n,m;
 12
 13 //****************************//树状数组
 14 int lowbit(int x)
 15 {
 16     return x&-x;
 17 }
 18
 19 void add(int x,int y,int w)
 20 {
 21     int i,j;
 22     for(i=x;i<=n;i+=lowbit(i))
 23     {
 24         for(j=y;j<=m;j+=lowbit(j))
 25             sum[i][j]+=w;
 26     }
 27 }
 28
 29 int get_sum(int x,int y)
 30 {
 31     int i,j,ans=0;
 32     for(i=x;i>0;i-=lowbit(i))
 33     {
 34         for(j=y;j>0;j-=lowbit(j))
 35         {
 36             ans+=sum[i][j];
 37         }
 38     }
 39     return ans;
 40 }
 41 //*****************************//
 42
 43 int find(int x1,int y1,int x2,int y2)
 44 {
 45     return get_sum(x2,y2)-get_sum(x1-1,y2)-get_sum(x2,y1-1)+get_sum(x1-1,y1-1);
 46 }
 47
 48 int main()
 49 {
 50     int i,j,w,x1,x2,y1,y2;
 51     freopen("D:\\in.txt","r",stdin);
 52     while(scanf("%d%d",&n,&m)==2)
 53     {
 54         memset(sum,0,sizeof(sum));
 55         memset(v,0,sizeof(v));
 56         for(i=1;i<=n;i++)
 57         {
 58             for(j=1;j<=m;j++)
 59             {
 60                 scanf("%d",&w);
 61                 if(!w)
 62                     v[i][j]=1;
 63                 else
 64                     add(i,j,w);
 65             }
 66         }
 67         for(i=0;i<=m;i++)
 68         {
 69             h[i]=0;l[i]=1;r[i]=m;
 70         }
 71         int lm,rm,ans=0,temp;
 72         for(i=1;i<=n;i++)
 73         {
 74             lm=1;
 75             for(j=1;j<=m;j++)
 76             {
 77                 if(!v[i][j])
 78                 {
 79                     h[j]++;
 80                     if(lm>l[j])
 81                         l[j]=lm;
 82                 }
 83                 else
 84                 {
 85                     h[j]=0; //边界不能有洞,所以障碍点高度是0,而不是1
 86                     l[j]=1;
 87                     r[j]=m;
 88                     lm=j+1; //由于边界不能有洞,所以加1
 89                 }
 90             }
 91             rm=m;
 92             for(j=m;j>0;j--)
 93             {
 94                 if(r[j]>rm)
 95                     r[j]=rm;
 96                 if(h[j])
 97                 {
 98                     y1=l[j];y2=r[j]; //处理出举行的左上点和右下点
 99                     x1=i-h[j]+1;x2=i;
100                     temp=find(x1,y1,x2,y2);  //利用二维数转数组进行求和
101                     if(temp>ans)
102                         ans=temp;
103                 }
104                 else
105                     rm=j-1; //同理减一
106             }
107         }
108         printf("%d\n",ans);
109     }
110     return 0;
111 }

转载于:https://www.cnblogs.com/ka200812/archive/2012/09/30/2709217.html

[OIBH] 糖果盒(Candy Box)——又一个最大子矩形相关推荐

  1. 用极大化思想解决最大子矩形问题

    最大子矩形问题:在一个给定的矩形中有一些障碍点,要找出内部不包含任何障碍点的,轮廓与整个矩形平行或重合的最大子矩形. 定义有效子矩形为内部不包含任何障碍点的,边界与坐标轴平行的子矩形. 有效子矩形 非 ...

  2. 最大子矩形问题的解决方法:悬线法

    给出一道板子题 洛谷4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  3. 二维数组求最小值_05-最大子矩形-最大值减去最小值小于或等于num的子数组数量...

    年轻即出发... 简书:https://www.jianshu.com/u/7110a2ba6f9e 知乎:https://www.zhihu.com/people/zqtao23/posts Git ...

  4. PHP判断一个点在矩形区域什么位置

    原文地址 https://xiegaosheng.com/post/view?id=77 PHP判断一个点在矩形区域什么位置:随便标记一个点就生成点的上下最有区域的id: 首先需要准备区域表fgare ...

  5. HTML5系列代码:绘制一个圆形和矩形叠加的图形

    一个画布在网页中是一个矩形框,通过 元素来绘制. 注意: 默认情况下 元素没有边框和内容. <!DOCTYPE HTML> <html> <head> <me ...

  6. d3js绘制y坐标轴_用d3js创建一个简单的矩形图

    用d3js创建一个简单的矩形 前言 本文并不是针对初学者的教程, 而是对矩形图绘制的基本流程做一个总结, 整理一下d3的基本工作流程. 正文 用d3创建矩形图一般分为下面几个步骤 flow.png b ...

  7. 用python画布tkinter画一个简单的矩形

    今早简单学了下python3.8的tkinter画布工具,代码如下: # !/usr/bin/python # -*- coding: UTF-8 -*- if __name__=="__m ...

  8. java 绘制长方形_Java如何使用GUI绘制一个实心的矩形?

    在Java的GUI编程中,如何使用GUI绘制一个实心的矩形? 以下示例演示如何使用Graphics类的fillRect()方法显示一个实心矩形. package com.yiibai; import ...

  9. Virtura box 构建一个简单局域网并联入外网

    为什么80%的码农都做不了架构师?>>>    这是我早在13年那个时候学习时做的,分享给大家,本来发表在51CTO的,后来走着走着就走到编程了,想想挺搞笑的 第一步:下载virtu ...

最新文章

  1. ui产品小结 - 包含小程序 前端等
  2. 云栖科技评论NO.2 | 张学友演唱会逃犯集中落网,真正的“神捕”其实是AI
  3. git 本地仓库同时推送到多个远程仓库
  4. 【原创】大叔经验分享(33)hive select count为0
  5. 流浪地球与战狼2所反映的文化心态
  6. 计算机组成原理实验软件仿真系统_计算机系统组成原理(基础)
  7. 【HDOJ】4363 Draw and paint
  8. javascript 中的 call
  9. 三个等于号===和两个等于号==的区别
  10. ubuntu 常用指令
  11. ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别
  12. Android Add new target
  13. jvm 调优 2020.09.07
  14. 【深入理解Java原理】ThreadLocal
  15. c语言银行卡六位密码编译,用c语言生成六位的随机密码。
  16. pytroch教程(一)
  17. 【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
  18. 灰度重心法提取中心线遇到的问题
  19. 李宏毅机器学习课程 思维导图
  20. 排序算法之——归并排序和快速排序

热门文章

  1. 安装elasticsearch-php,安装 |《Elasticsearch-PHP 中文文档 6.0》| PHP 技术论坛
  2. ad如何设置pcb板子形状_俺老孙画个圈板框与安装孔PCB系列教程110
  3. springboot+mybatis集成自定义缓存ehcache用法笔记
  4. 你还在使用fastjson,可以尝试jsoncode
  5. 收集42款经典的Chrome 插件
  6. 3大原则让你的编程之路越走越顺
  7. 写最少的代码,避免给自己找麻烦
  8. 树莓派的几种登录方式及树莓派的网络配置
  9. Windows下Mysql 的安装和卸载
  10. gcc 5.2.0 手动更新(亲测)