[OIBH] 糖果盒(Candy Box)——又一个最大子矩形
http://codewaysky.sinaapp.com/problem.php?id=1056
这题和奶牛浴场略有区别,奶牛浴场只需要求出最大子矩形,而这题要求的是最大权重子矩形,不一定要最大的面积,但要最大的权重和
思路是先求出每个最大子矩形,然后求出每个矩形的左上点和右下点,然后用二维数转数组进行求和,保存最优解
![](/assets/blank.gif)
![](/assets/blank.gif)
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)——又一个最大子矩形相关推荐
- 用极大化思想解决最大子矩形问题
最大子矩形问题:在一个给定的矩形中有一些障碍点,要找出内部不包含任何障碍点的,轮廓与整个矩形平行或重合的最大子矩形. 定义有效子矩形为内部不包含任何障碍点的,边界与坐标轴平行的子矩形. 有效子矩形 非 ...
- 最大子矩形问题的解决方法:悬线法
给出一道板子题 洛谷4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...
- 二维数组求最小值_05-最大子矩形-最大值减去最小值小于或等于num的子数组数量...
年轻即出发... 简书:https://www.jianshu.com/u/7110a2ba6f9e 知乎:https://www.zhihu.com/people/zqtao23/posts Git ...
- PHP判断一个点在矩形区域什么位置
原文地址 https://xiegaosheng.com/post/view?id=77 PHP判断一个点在矩形区域什么位置:随便标记一个点就生成点的上下最有区域的id: 首先需要准备区域表fgare ...
- HTML5系列代码:绘制一个圆形和矩形叠加的图形
一个画布在网页中是一个矩形框,通过 元素来绘制. 注意: 默认情况下 元素没有边框和内容. <!DOCTYPE HTML> <html> <head> <me ...
- d3js绘制y坐标轴_用d3js创建一个简单的矩形图
用d3js创建一个简单的矩形 前言 本文并不是针对初学者的教程, 而是对矩形图绘制的基本流程做一个总结, 整理一下d3的基本工作流程. 正文 用d3创建矩形图一般分为下面几个步骤 flow.png b ...
- 用python画布tkinter画一个简单的矩形
今早简单学了下python3.8的tkinter画布工具,代码如下: # !/usr/bin/python # -*- coding: UTF-8 -*- if __name__=="__m ...
- java 绘制长方形_Java如何使用GUI绘制一个实心的矩形?
在Java的GUI编程中,如何使用GUI绘制一个实心的矩形? 以下示例演示如何使用Graphics类的fillRect()方法显示一个实心矩形. package com.yiibai; import ...
- Virtura box 构建一个简单局域网并联入外网
为什么80%的码农都做不了架构师?>>> 这是我早在13年那个时候学习时做的,分享给大家,本来发表在51CTO的,后来走着走着就走到编程了,想想挺搞笑的 第一步:下载virtu ...
最新文章
- ui产品小结 - 包含小程序 前端等
- 云栖科技评论NO.2 | 张学友演唱会逃犯集中落网,真正的“神捕”其实是AI
- git 本地仓库同时推送到多个远程仓库
- 【原创】大叔经验分享(33)hive select count为0
- 流浪地球与战狼2所反映的文化心态
- 计算机组成原理实验软件仿真系统_计算机系统组成原理(基础)
- 【HDOJ】4363 Draw and paint
- javascript 中的 call
- 三个等于号===和两个等于号==的区别
- ubuntu 常用指令
- ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别
- Android Add new target
- jvm 调优 2020.09.07
- 【深入理解Java原理】ThreadLocal
- c语言银行卡六位密码编译,用c语言生成六位的随机密码。
- pytroch教程(一)
- 【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
- 灰度重心法提取中心线遇到的问题
- 李宏毅机器学习课程 思维导图
- 排序算法之——归并排序和快速排序
热门文章
- 安装elasticsearch-php,安装 |《Elasticsearch-PHP 中文文档 6.0》| PHP 技术论坛
- ad如何设置pcb板子形状_俺老孙画个圈板框与安装孔PCB系列教程110
- springboot+mybatis集成自定义缓存ehcache用法笔记
- 你还在使用fastjson,可以尝试jsoncode
- 收集42款经典的Chrome 插件
- 3大原则让你的编程之路越走越顺
- 写最少的代码,避免给自己找麻烦
- 树莓派的几种登录方式及树莓派的网络配置
- Windows下Mysql 的安装和卸载
- gcc 5.2.0 手动更新(亲测)