CF508E Arthur and Brackets

题目大意:给出n对括号,并给出每对括号距离的范围。问能否找到这样一个序列。

题解:好多人都用贪心。这么好的题为什么不搜一发呢?

注意:千万不要在dfs里面更新答案。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 605
int n,p1[N],p2[N],ans[N<<1];
int f[N][N],ch[N][N][2],g[N][N];
int check(int l,int r,int st)
{
    if(l>r)return 1;
    if(f[l][r]!=-1)return f[l][r];
    for(int i=p1[l];i<=p2[l]&&i<2*(r-l+1);i+=2)
    {
        if(check(l+1,l+(i-1)/2,st+1)&&check(l+(i+1)/2,r,st+i+1))
        {
            g[l][r]=i;
            ch[l][r][0]=l+1;
            if(l+(i+1)/2<=r)ch[l][r][1]=l+(i+1)/2;
            return f[l][r]=1;
        }
    }
    return f[l][r]=0;
}
void print(int l,int r)
{
    if(l>r)return ;
    printf("(");
    print(l+1,l+(g[l][r]-1)/2);
    printf(")");
    print(l+(g[l][r]+1)/2,r);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&p1[i],&p2[i]);
        if(p1[i]%2==0)p1[i]++;
    }
    memset(f,-1,sizeof f);
    for(int i=1;i<=n;i++)
    {
        if(p1[i]>p2[i])
        {
            printf("IMPOSSIBLE\n");
            return 0;
        }
    }
    if(check(1,n,1))
    {
        print(1,n);
        printf("\n");
    }else
    {
        printf("IMPOSSIBLE\n");
    }
    return 0;
}

 

posted @ 2018-10-22 18:48  LiGuanlin  阅读(242)  评论(0编辑  收藏  举报