hdu 1506
题意:求一个直方图中最大的矩形面积
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100010], l[100010], r[100010];
int main()
{
int n;
while(scanf("%d", &n), n)
{
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
r[i] = l[i] = i;
}
a[0] = a[n+1] = -1;
for(int i=1; i<=n; i++)
while(a[l[i]-1] >= a[i])
l[i] = l[l[i]-1];
for(int i=n; i>=1; i--)
while(a[r[i]+1] >= a[i])
r[i] = r[r[i]+1];
__int64 ans = 0;
for(int i=1; i<=n; i++)
ans = max(ans, (__int64)(r[i]-l[i]+1) * a[i]);
printf("%I64d\n", ans);
}
return 0;
}
hdu 1505
题意:求一个01矩阵中的最大全1矩阵
#include <cstdio>
#include <algorithm>
using namespace std;
int mat[1010][1010], h[1010], l[1010], r[1010];
int t, n, m;
char s[5];
int main()
{
scanf("%d", &t);
while(t--)
{
int ans = 0;
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
mat[i][j] = 0;
scanf("%s", s);
if(s[0] == 'F')
mat[i][j] = 1;
}
for(int i=1; i<=m; i++)
h[i] = 0;
h[0] = h[m+1] = -1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(mat[i][j])
h[j]++;
else
h[j] = 0;
}
for(int j=1; j<=m; j++)
l[j] = r[j] = j;
for(int j=1; j<=m; j++)
while(h[l[j]-1] >= h[j])
l[j] = l[l[j]-1];
for(int j=m; j>=1; j--)
while(h[r[j]+1] >= h[j])
r[j] = r[r[j]+1];
for(int j=1; j<=m; j++)
ans = max(ans, (r[j]-l[j]+1) * h[j]);
}
printf("%d\n", ans * 3);
}
return 0;
}