hdu 1506 Largest Rectangle in a Histogram (最大子矩阵)
2016-07-29 10:17
405 查看
题意:容易理解...
分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到
右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100010
#define MOD 1000000007
long long c[maxn];
int n;
long long a[maxn],b[maxn];
int main()
{
int t;
//scanf("%d",&t);
while(scanf("%d",&n) && n)
{
for(int i = 0; i < n; i++)
scanf("%lld",&a[i]);
b[0] = 0;
for(int i = 1; i < n; i++)
{
int t = i;
while(a[t-1] >= a[i] && t > 0)
t = b[t-1];
b[i] = t;
}
c[n-1] = n-1;
for(int i = n-2; i >= 0; i--)
{
int t = i;
while(a[t+1] >= a[i] && t < n-1)
t = c[t+1];
c[i] = t;
}
long long ans = 0;
for(int i = 0; i < n; i++)
ans = max(ans,(c[i]-b[i]+1)*a[i]);
printf("%lld\n",ans);
}
return 0;
}
分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到
右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100010
#define MOD 1000000007
long long c[maxn];
int n;
long long a[maxn],b[maxn];
int main()
{
int t;
//scanf("%d",&t);
while(scanf("%d",&n) && n)
{
for(int i = 0; i < n; i++)
scanf("%lld",&a[i]);
b[0] = 0;
for(int i = 1; i < n; i++)
{
int t = i;
while(a[t-1] >= a[i] && t > 0)
t = b[t-1];
b[i] = t;
}
c[n-1] = n-1;
for(int i = n-2; i >= 0; i--)
{
int t = i;
while(a[t+1] >= a[i] && t < n-1)
t = c[t+1];
c[i] = t;
}
long long ans = 0;
for(int i = 0; i < n; i++)
ans = max(ans,(c[i]-b[i]+1)*a[i]);
printf("%lld\n",ans);
}
return 0;
}
相关文章推荐
- 【刷题之路】翻转单词顺序列
- MySQL冷备份过程
- 练习 3
- Android背景相关与系统架构分析
- The entitlements specified in your application’s Code Signing Entitlements file do not match those s
- 设计模式之观察者模式实例
- Largest Number
- 《深入理解JVM》读书系列二
- Debian8.0 好用的软件源及更新步骤
- Understanding Peoplesoft Trace
- ::RegisterWindowMessage的用法
- 使用vim文本编辑器的几条小技巧
- Eclipse导入maven项目时报错:maven-resources-plugin:2.5 or one of its dependencies could not be resolved
- 针对返回码不是200
- 二分图的最大匹配深搜算法
- nginx 面试
- jQuery动态添加.active属性实现按钮点击样式
- 修改ToolBar上menu字体的大小
- Spring4----使用注解方式配置bean和bean的属性
- 给当前页或者跳转后页面的导航栏添加选中样式