HDU1506
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意很简单。
然后这个做法:左右扫+迭代的过程很巧妙
向左扫: 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];
提供几个样例:
4 2 2 5 5 结果10 6 2 5 2 5 5 2 结果12
加强版题目:在矩阵中求最大矩形面积HDOJ 1505
再套一成循环:
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
char s[10];
scanf("%s",s);
if (s[0]=='R') p[j]=0;
else p[j]++;
}
for (int i=1;i<=m;i++)
l[i]=r[i]=i;
p[0]=p[m+1]=-1;
for (int i=1;i<=m;i++)
while (p[l[i]-1]>=p[i]) l[i]=l[l[i]-1];
for (int i=m;i>=1;i--)
while (p[r[i]+1]>=p[i]) r[i]=r[r[i]+1];
for (int i=1;i<=m;i++)
ans=max(ans,(r[i]-l[i]+1)*p[i]);
}
随性Code