51Nod Problem 1102 面积最大的矩形(DP)
来源:互联网 发布:qq飞车淘宝刷徒弟流程 编辑:程序博客网 时间:2024/05/01 03:35
此文章可以使用目录功能哟↑(点击上方[+])
51Nod Problem 1102 面积最大的矩形
Accept: 0 Submit: 0
Time Limit: 1 second Memory Limit : 131072 KB
Problem Description
有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000)
第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
Output
输出最大的矩形面积
Sample Input
2
1
5
6
2
3
Sample Output
Hint
Problem Idea
解题思路:
【题意】
求直方图的最大矩形面积,每个宽度为1,数组a表示每块的高度
【类型】
动态规划
【分析】
如果做过类似题目的话,这题就非常得心应手了
我们只需预处理出以a[i]作为矩阵的宽时,该矩阵的长能延伸何处,然后枚举每个矩形,挑选出面积最大的即可
就比如样例
预处理的结果为:
故结果为10
那么此题的动态规划用在何处呢?
莫急,在我们求解矩形的长时,要计算矩形左边会延伸至何处,右边延伸至何处
显然,这部分不可能每次都遍历一遍,这样复杂度太高
我们要借助之前求得的值来减少访问次数,例如以i位置为起点,向左延伸
首先和i-1位置的高度进行比较,若a[i-1]<a[i],那这矩形已经无法再延伸下去了,所以l[i]=i;
若a[i-1]≥a[i],说明可以延伸下去,而且至少能延伸至l[i-1],为什么呢?
因为a[i-1]能延伸至l[i-1],说明这部分的高度通通都是大于等于a[i-1]的,而a[i-1]≥a[i],所以a[i]也必定可以延伸至l[i-1]
同理,处理出r[i],这样以a[i]作为矩形的宽时,矩形的长为r[i]-l[i]+1
【时间复杂度&&优化】
O(nlogn)
题目链接→51Nod Problem 1102 面积最大的矩形
Source Code
/*Sherlock and Watson and Adler*/#pragma comment(linker, "/STACK:1024000000,1024000000")#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<stack>#include<math.h>#include<vector>#include<map>#include<set>#include<bitset>#include<cmath>#include<complex>#include<string>#include<algorithm>#include<iostream>#define eps 1e-9#define LL long long#define PI acos(-1.0)#define bitnum(a) __builtin_popcount(a)using namespace std;const int N = 50005;const int M = 100005;const int inf = 1000000007;const int mod = 1000000007;__int64 a[N];int l[N],r[N];int main(){ int n,i,k; __int64 ans=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%I64d",&a[i]); for(i=1;i<=n;i++) { k=i-1; while(a[i]<=a[k]) k=l[k]-1; l[i]=k+1; } for(i=n;i>=1;i--) { k=i+1; while(a[i]<=a[k]) k=r[k]+1; r[i]=k-1; } for(i=1;i<=n;i++) ans=max(ans,a[i]*(r[i]-l[i]+1)); printf("%I64d\n",ans); return 0;}菜鸟成长记
- 51Nod Problem 1102 面积最大的矩形(DP)
- 51nod 1102 面积最大的矩形
- 51NOD 1102 面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51nod-【1102 面积最大的矩形】
- 51Nod 1102 面积最大的矩形
- 51nod-1102 面积最大的矩形
- 51nod 1102 面积最大的矩形
- 51Nod 1102 面积最大的矩形
- 51nod-1102 . 面积最大的矩形&&hdu-1506
- 51Nod-1102-面积最大的矩形
- 51nod 1102 面积最大的矩形【单调栈、预处理】
- 51nod 1102 面积最大的矩形(单调栈)
- 51nod 1102 -面积最大的矩形问题
- 1102 面积最大的矩形(简单DP)
- 【51Nod】1102 - 面积最大的矩形面积(单调栈)
- 1102 面积最大的矩形
- POJ 2559 &&HDU 1506 Largest Rectangle in a Histogram && 51nod 1102 面积最大的矩形 单调栈的应用
- ecshop二次开发--广告投放
- 批处理备份及删除,forfiles命令详解
- 使用vim分割窗口时如何改变窗口的尺寸
- linux使用---2.linux使用记录2
- hdu4276 The Ghost Blows Light(树型dp)
- 51Nod Problem 1102 面积最大的矩形(DP)
- 图片的展示
- JAR和AAR
- 代码重构
- POJ 3463 Sightseeing【次短路,Dijkstra算法,链式前向星建图】
- perl binlog dml操作报告
- 记录一些需要膜拜的前辈blog
- 2-CSS基本样式讲解
- xml解析