zoukankan      html  css  js  c++  java
  • 洛谷 P1241 括号序列

    P1241 括号序列

    题目描述

    定义如下规则序列(字符串):

    1.空序列是规则序列;

    2.如果S是规则序列,那么(S)和[S]也是规则序列;

    3.如果A和B都是规则序列,那么AB也是规则序列。

    例如,下面的字符串都是规则序列:

    (),[],(()),([]),()[],()[()]

    而以下几个则不是:

    (,[,],)(,()),([()

    现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列。(对于序列a1,a2,…,an和序列bl,b2,…,bm,如果存在一组下标1≤i1<i2<…<in≤m,使得aj=b(i,j)对一切1≤j≤n成立,那么a1,a2…,an就叫做b1,b2,…,bm的子列。

    输入输出格式

    输入格式:

    输入文件仅一行,全部由‘(’,‘)’,‘]’,‘]’组成,没有其他字符,长度不超过100。

    输出格式:

    输出文件也仅有一行,全部由‘(’,‘)’,‘]’,‘]’组成,没有其他字符,把你找到的规则序列输出即可。因为规则序列可能不止一个,因此要求输出的规则序列中嵌套的层数尽可能地少。

    输入输出样例

    输入样例#1:
    ([()
    
    输出样例#1:
    ()[]()
    

    说明

    输出解释:

    {最多的嵌套层数为1,如层数为2时的一种为()[()]}

    jsoi2011

    /*69分 维护栈*/
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int MAXN=120;
    const int INF=0x7fffffff;
    int f[MAXN][MAXN],a[MAXN][MAXN];
    char s[MAXN];
    int n;
    void aaaa(int x,int y)
    {
        if (x>y)
            return;
        if (x==y)
        {
            if (s[x]=='('||s[x]==')')
                printf("()");
            else  
                printf("[]");
        }    
        else
        {
            if (a[x][y]==-1)
            {
                if(s[x]=='(')
                {
                    printf("(");
                    aaaa(x+1,y-1);
                    printf(")");
                }    
                else
                {
                    printf("[");
                    aaaa(x+1,y-1);
                    printf("]");
                }    
            } 
            else
            {
                aaaa(x,a[x][y]);
                aaaa(a[x][y]+1,y);
            }       
        }    
    }       
    int main()
    {
      // gets(s);
         scanf("%s",&s);
         n=strlen(s);
        memset(f,0,sizeof(f));
        for (int i=n;i>0;i--)
        {
            s[i]=s[i-1];
            f[i][i]=1;
        }    
        int tot;
        for (int p=1;p<=n;p++)
        {
            for (int i=1;i<=n-p;i++)
            {
                int j=i+p;
                f[i][j]=INF;
                if ((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
                {
                    tot=f[i+1][j-1];
                    if (f[i][j]>tot)
                       f[i][j]=tot;
                }    
                a[i][j]=-1;
                for (int k=i;k<j;k++)
                {
                    tot=f[i][k]+f[k+1][j];
                    if (f[i][j]>tot)
                    {
                        f[i][j]=tot;
                        a[i][j]=k;
                    }    
                }    
            }    
        }  
        aaaa(1,n);
        return 0;
    }
  • 相关阅读:
    Spring MVC异常处理
    Spring MVC 数据校验
    Spring MVC 拦截器(Interceptor)
    Spring MVC 表单标签库
    Spring MVC 数据格式化(Formatter)
    Spring MVC 类型转换器(Converter)
    Spring MVC @ModelAttribute注解
    Spring MVC @Autowired和@Service注解
    如何在Storyboard中使用Scroll view
    学好Python的五本书
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5878894.html
Copyright © 2011-2022 走看看