括號序列


題目描述

  定義如下規則序列(字符串):

    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

【題目分析】

    說一下大體思路,dp[i][j]表示從i到j需要插入的括號的個數,path[i][j]記錄i到j中划分位置k,遞歸輸出

    非滿分算法

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1100;
char str[maxn];
int dp[maxn][maxn],p[maxn][maxn],len;
void print(int start,int end)
{
    if(start>end)
        return ;
    else if(start==end)//找到沒有被匹配的括號 
    {
        if(str[start]=='('||str[end]==')')
            printf("()");
        else 
            printf("[]");
    }
    else if(p[start][end]==-1)//如果這段括號中沒有被分割的位置 
    {
        printf("%c",str[start]);
        print(start+1,end-1);
        printf("%c",str[end]);
    }
    else //從p[start][end]處被分開,遞歸輸出 
    {
        print(start,p[start][end]);
        print(p[start][end]+1,end);
    }
}
int main()
{
    memset(dp,0,sizeof dp);
    scanf("%s",str+1);
    len=strlen(str+1);
    for(int i=1;i<=len;i++)
        dp[i][i]=1;
    for(int l=2;l<=len;l++)
        for(int i=1;i<=len-1;i++)
        {
            int j=i+l-1;
            if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')
                dp[i][j]=dp[i+1][j-1],
                p[i][j]=-1;
            else dp[i][j]=0x7fffffff;
            for(int k=i;k<=j-1;k++)
              if(dp[i][j]>dp[i][k]+dp[k][j])
                dp[i][j]=dp[i][k]+dp[k][j],
                p[i][j]=k;
        }
    print(1,len);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM