BZOJ 3039: 옥섬궁 | 현선dp

2972 단어 현선법
먼저 점 하나하나가 위로 가장 많이 뻗은 길이를 구하고 그 다음에 좌우로 뻗는다. 이게 어떻게 선형적이냐에 따라 정해가 단조로운 것 같다. 자세를 바꾸면 비슷한 것을 쓸 수 있다. 코드를 직접 보자. 코드는 매우 간단하다. ps: 본제 랭킹 1페이지에 들어가려면 getchar를 사용해야 한다.
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define T 1111
using namespace std;
int h[T],l[T],r[T];
int n,m,ans;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char c=getchar();
            while(c!='R'&&c!='F')c=getchar();
            if(c=='F')h[j]++; else h[j]=0;
            l[j]=r[j]=j;
        }
        for(int j=1;j<=m;j++)if(h[j])
            while(h[j]<=h[l[j]-1])l[j]=l[l[j]-1];
        for(int j=m;j>=1;j--)if(h[j])
        {
            while(h[j]<=h[r[j]+1])r[j]=r[r[j]+1];
            ans=max(ans,h[j]*(r[j]-l[j]+1));
        }
    }
    cout<<ans*3;
    return 0;
}

좋은 웹페이지 즐겨찾기