zoukankan      html  css  js  c++  java
  • CODEVS 3657 括号序列

    【问题描述】

    我们用以下规则定义一个合法的括号序列:

    (1)空序列是合法的

    (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的

    (3)假如A 和 B 都是合法的,那么AB和BA也是合法的

    例如以下是合法的括号序列:

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

    以下是不合法括号序列的:

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

    现在给定一些由'(', ')', '[', ,']'构成的序列 ,请添加尽量少的括号,得到一个合法的括号序列。

    【输入】

    输入包括号序列S。含最多100个字符(四种字符: '(', ')', '[' and ']') ,都放在一行,中间没有其他多余字符。

    【输出】

    使括号序列S成为合法序列需要添加最少的括号数量。

    【样例输入】

    ([()

    【样例输出】

    2
    【样例说明】
    最少添加2个括号可以得到合法的序列:()[()]或([()])
    【数据范围】S的长度<=100 (最多100个字符)。

    解题思路
     1 program kuohao;
     2 uses math;
     3 const maxn=255;
     4 var
     5 f:Array[0..maxn,0..maxn] of longint;
     6   s:string;
     7   p,i,j,k,min,flag:Longint;
     8 begin
     9     readln(s);
    10     for i:=1 to length(s) do f[i,i]:=1;
    11     for p:=1 to length(s) do//枚举次数
    12         for i:=1 to length(s)-p do//枚举起点
    13         begin
    14             min:=maxlongint;
    15             flag:=0;
    16             j:=i+p;
    17             if ((s[i]='(') and(s[j]=')')) or((s[i]='[')and (s[j]=']'))
    18             then
    19             begin
    20                 f[i,j]:=f[i+1,j-1];
    21                 flag:=1;
    22             end;
    23             for k:=i to j-1 do//枚举决策
    24             begin
    25                  if f[i,k]+f[k+1,j]<min then min:=f[i,k]+f[k+1,j];
    26             end;
    27             if (min<f[i,j]) or (flag=0) then f[i,j]:=min;
    28     writeln(f[1,length(s)]);
    29 end.
    
    
    

  • 相关阅读:
    Daily Scrum 12.14
    Daily Scrum 12.13
    sss
    sss
    sss
    sss
    sss
    sss
    sss
    sss
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4740399.html
Copyright © 2011-2022 走看看