HDU2870 最大窗口面积

Posted ---学习ing---

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2870 最大窗口面积相关的知识,希望对你有一定的参考价值。

以前做的是单调队列的方法,现在试一试DP

注意的是对于i,向左延伸的L[i]到i不一定是单调的,比如1 3 2 1 2,对于i=4,L[i]=1而是2所以不能简单的和左边第一个比较  

  错:  if(a[i]<=a[i-1]) L[i]=L[i-1]+1;

HDU1506
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory.h>
using namespace std;
#define LL long long 
const int maxn=100010;
LL L[maxn],R[maxn],h[maxn],ans,tmp;
int main()
{
    int n,i,t;
    while(~scanf("%d",&n))
    {
        if(n==0) return  0;
        for(i=1;i<=n;i++) scanf("%lld",&h[i]);
        L[1]=1;R[n]=n;
        for(i=2;i<=n;i++) {
            t=i;
            while(t>1&&h[t-1]>=h[i]) t=L[t-1];
            L[i]=t;
        }
        for(i=n-1;i>=1;i--){
            t=i;
            while(t<n&&h[t+1]>=h[i]) t=R[t+1];
            R[i]=t;
        }
        ans=h[1];
        for(i=1;i<=n;i++){
            tmp=h[i]*(R[i]-L[i]+1);
            if(tmp>ans) ans=tmp;
        }
        printf("%lld\n",ans);
    }
    return 0;
}


HDU2870
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory.h>
#include<cmath>
using namespace std;
char c[1010][1010];
int L[1010],R[1010],D[1010][1010];
int n,m,ans;
bool _w(char a,char b){
    if(b==a&&(a==a||a==w||a==y||a==z)) return true;
    if(b==b&&(a==b||a==w||a==x||a==z)) return true;
    if(b==c&&(a==c||a==y||a==x||a==z)) return true; 
    return false;
}
void _get(char u)
{
       int i,j,t;
       memset(D,0,sizeof(D));
       memset(L,0,sizeof(L));
       memset(R,0,sizeof(R));
       for(i=n;i>=1;i--)
        for(j=1;j<=m;j++)
         if(_w(c[i][j],u)) 
           D[i][j]=D[i+1][j]+1;
       for(i=1;i<=n;i++){
          L[1]=1;R[m]=m;
          for(j=2;j<=m;j++){
                t=j;
                while(t>1&&D[i][j]<=D[i][t-1]) t=L[t-1];
                L[j]=t;
          } 
          for(j=m-1;j>=1;j--){
                t=j;
                while(t<m&&D[i][j]<=D[i][t+1]) t=R[t+1];
                R[j]=t;
          }
          for(j=1;j<=m;j++){
            ans=max(ans,(R[j]-L[j]+1)*D[i][j]);
          }
       }
}
int main()
{
     while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
        ans=0;
        _get(a);
        _get(b);
        _get(c);
        printf("%d\n",ans);
     }
     return 0;
}

以上是关于HDU2870 最大窗口面积的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2870 Largest Submatrix (单调栈)

hdu 1506 最大子矩阵面积

HDOJ2870 Largest Submatrix

(hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)

hdu6219(最大空凸包)

HDU 5135(再思考)