给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
这个问题和前面我们讲过的一个盛最多水的容器很相似,不同的地方是这个边界可以不为首尾,因为内部也可能存在更大面积的矩形,而那个题目要求以两个边界为前提,组成的容器。上次我准备用dp来解决,没有成功,那是因为原理不符,没有最优子结构。这个问题就可以用dp来解决了。
首先我们来看,存在最优子结构,如果目前存在最大的矩形的面积,再加一个柱子,我们可以判断出加上它,最大的矩形面积。然后这个子问题也是重叠的,在加不加新柱子的问题上,我们判断最大矩形面积的方法是一样的,唯一不同的是边界不同,也就对应的参数不同。另外问题的边界也存在,就是我们输入的这几个高度。子问题的求解也是独立的。
int main()
{int n;cin >> n;vector<long> h(n+1);for (int i = 1; i <= n; i++)cin >> h[i];vector<vector<long>> dp(n+1, vector<long>(n+1));for (int i = 1; i <= n; i++)dp[i][i] = h[i];int min_h;//  for (int i = n-1; i >= 1; i--)//  {//for (int j = i; j <= n; j++)//      {//          min_h = h[i];//          for (int k = i; k <= j; k++)//              min_h = min_h < h[k] ? min_h : h[k];//          dp[i][j] = (min_h *(j - i + 1)) > dp[i][j - 1] ? (min_h *(j - i + 1)) : dp[i][j - 1];//          dp[j][i] = dp[i][j] = dp[i][j] > dp[i + 1][j] ? dp[i][j] : dp[i + 1][j];//      }//  }for (int j = 1; j<=n; j++){for (int i = j-1; i >= 1; i--){min_h = h[i];for (int k = i; k <= j; k++)min_h = min_h < h[k] ? min_h : h[k]; dp[i][j] = (min_h *(j - i + 1)) > dp[i][j - 1] ? (min_h *(j - i + 1)) : dp[i][j - 1];dp[j][i] = dp[i][j] = dp[i][j] > dp[i + 1][j] ? dp[i][j] : dp[i + 1][j];}}for(int i=0;i<=n;i++){cout << dp[1][i] << '\0';}return 0;
}

这里面,dp[i][j]代表从i到j的最大矩形面积。首先dp[i][i]就是该高度下的单个矩形面积。我们需要存储从i到j的最小高度,因为多加一个柱状图,我们需要判断以最小高度为高的矩形面积,比原来的最大矩形面积相比的结果。我们需要通过比较dp[i][j-1]和dp[i+1][j]以及新计算的面积三个来得到dp[i][j]。程序中加黑字体中,第一行将dp[i][j-1]和新面积相比,将最大值赋给了dp[i][j],但是这并不是最终的结果,因为如果dp[i+1][j]中的面积要大于这两个,我们就会漏掉。所以第二行也很必要。一定不能丢。

上述的过程不好理解的话,就理解下边界情况,如果就两个直方图,我们需要比较这两个单独的面积以及两个并在一起的面积,必须比较完这三个才能得到最大的面积。

(2)其实这道题还可以用单调栈来做,具体做法见上一篇《单调栈以及应用》,这里不再赘述。

转载于:https://www.cnblogs.com/mini-coconut/p/9108434.html

美团笔试最大矩形面积相关推荐

  1. 【刷题】美团笔试训练

    美团点评2017秋招笔试编程题 试题链接 1. 大富翁游戏 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n&l ...

  2. java 最大矩形_最大矩形面积

    34 ''' 分治法:最大矩形面积只可能有三种情况: 1. 取决于高度最小的柱子,此时面积等于高度乘总长度: 2. 最大面积出现在高度最小的柱子左边: 3. 最大面积出现在高度最小的柱子右边: ''' ...

  3. sdut 2401 最大矩形面积

    1http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2401 /* 2 最大矩形面积,把边界点加上 ...

  4. 语音计算矩形面积_LeetCode85-最大矩形

    今天在制作书签的时候 突然想到了一个问题 如果要送给未来的女朋友一个书签 上面该写些什么话 哈哈哈哈哈哈哈哈哈 The Spring is coming! 想了一会儿,觉得这句话最合适 To xxx: ...

  5. 编写矩形类 计算矩形面积

    编写矩形类 计算矩形面积 public class juxing {int a;int b; juxing(int a,int b){System.out.println("矩形面积s=&q ...

  6. 题目 1471:【蓝桥杯】【入门题】【基础练习VIP】矩形面积交

    题目 1471:矩形面积交 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 平面上有两个矩形 ...

  7. [学习笔记]矩形面积并

    常用的套路 各种合法矩形限制.合法区间对的限制,都可以转化为矩形面积并 如:省选模拟赛第十四轮.[ZJOI2019]语言 还有直接矩形:(HDU 1542) Atlantis 矩形面积并--扫描线.C ...

  8. 线段树求矩形面积并 扫描线+离散化

    顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中,这根线很重要.方向的话,可以左右扫,也可以上下扫.方法是一样的,这里我用的是由下向上的扫描法. 如上图所示,坐标系内有两个矩形.位置 ...

  9. python【蓝桥杯vip练习题库】BASIC-18 矩形面积交(线段交)

    试题 基础练习 矩形面积交 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你 ...

最新文章

  1. 【tensorboard】从tensorboard上看出模型是否存在过拟合
  2. 4.通过Ubuntu指令生成GIF图片
  3. python学习之路
  4. ThinkPHP的field方法的用法总结
  5. 使用 detours 框架 hook 函数
  6. UAC bypass 理论学习
  7. ubuntu20.04中gedit使用markdown插件(没搞定)
  8. python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐
  9. python的pip_同时装了Python3和Python2,怎么用pip?
  10. 采用python解决实际问题_应用 Python 解决一些实际问题
  11. 《0bug-C/C++商用工程之道》首版勘误表
  12. linux服务器端口的状态,Linux查看端口状态及关闭端口方法
  13. 多缝夫琅禾费衍射matlab,用matlab实现夫琅禾费多缝衍射代码
  14. Arduino mixly 点灯科技(blinker) 在线电压监测(带电压高低提醒)
  15. ★自助饮料售卖机,C语言 编辑题
  16. python 二值化细化_Python - 图像的细化(骨架抽取)
  17. 华为交换机ntp自动校时配置
  18. 开水果店的水果怎么保鲜,新手开水果店水果保鲜方法
  19. Java基础or介绍骚话
  20. [Python]numpy数据分析练习[21~30]

热门文章

  1. SqueezeNet网络模型详解
  2. 启动标志_牛股启动的标志:天衣无缝。
  3. 删除 Mac AppStore 正在下载的应用
  4. Any problem in computer science can be solved with another layer of indirection
  5. 用Python编写博客导出工具
  6. winxp 安装apache php,WinXP-Apache-PHP5-MySQL-phpMyAdmin环境安装
  7. MySQL探秘(五):InnoDB锁的类型和状态查询
  8. 联想电脑如何下载matlab,lenovo utility是什么软件?
  9. java解压gz文件
  10. Tomcat 6 数据源配置