zoukankan      html  css  js  c++  java
  • 1141Brackets Sequence结题报告

    Brackets Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 23638   Accepted: 6665   Special Judge

    Description

    Let us define a regular brackets sequence in the following way: 

    1. Empty sequence is a regular sequence. 
    2. If S is a regular sequence, then (S) and [S] are both regular sequences. 
    3. If A and B are regular sequences, then AB is a regular sequence. 

    For example, all of the following sequences of characters are regular brackets sequences: 

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

    And all of the following character sequences are not: 

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

    Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.

    Input

    The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.

    Output

    Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.

    Sample Input

    ([(]

    Sample Output

    ()[()]

    题目分析:
      显然题目是要求我们为一个输入序列添加最少的“[”或者“(”等符号来使之可以配对。要配对的办法肯定有很多种,我们检测到每一个括号都给他配对,那么最终多出了一倍的符号,这样肯定是配对的但是不符合最少的。因此我们采用一个区间DP的方法。pos[i][j]表示第i个和第j个字符之间的需要隔开的位置,若是匹配的则为-1,dp[i][j]表示第i个和第j个字符之间需要添加的字符数。具体见如下Java代码注释。
     1 import java.util.*;
     2 public class BracketsSequence1141 {
     3     private static char s[]=new char[105];//接受控制台的输入。
     4     private int len;//输入字符串的长度
     5     private int dp[][]=new int[105][105];//dp[i][j],从i到j需要插入的最小字符数
     6     private int pos[][]=new int[105][105];//pos[i][j],字符i与j是否匹配,若是则为-1,若不是则记录隔开的位置
     7     private void print(int i,int j){
     8         //输出结果
     9         if(i>j)
    10             return;
    11         if(i==j){
    12             if(s[i]=='('||s[i]==')')
    13                 System.out.print("()");
    14             else
    15                 System.out.print("[]");
    16         }
    17         else{
    18             if(pos[i][j]==-1){//如果字符是匹配的
    19                 System.out.print(s[i]);
    20                 print(i+1,j-1);
    21                 System.out.print(s[j]);
    22             }
    23             else{//字符不匹配
    24                 print(i,pos[i][j]);
    25                 print(pos[i][j]+1,j);
    26             }
    27         }
    28     };
    29     private void getDP(){
    30         int inf=0x7fffffff;
    31         int i,j,k,mid;
    32         int len=s.length;
    33         for(i=0;i<len;i++){
    34             for(j=0;j<len;j++){
    35                 dp[i][j]=0;
    36             }
    37             dp[i][i]=1;
    38         }
    39         for(k=1;k<len;k++){
    40             for(i=0;i+k<len;i++){
    41                 j=i+k;//表示不断地分隔,比较不同字符之间是否匹配
    42                 dp[i][j]=inf;//表示目前不可匹配
    43                 if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){
    44                     //表示字符配对
    45                     dp[i][j]=dp[i+1][j-1];
    46                     pos[i][j]=-1;
    47                 }
    48                 //若字符不配对或者其他,表示寻找更少的配对数
    49                 for(mid=i;mid<j;mid++){
    50                     if(dp[i][j]>dp[i][mid]+dp[mid+1][j]){
    51                         dp[i][j]=dp[i][mid]+dp[mid+1][j];
    52                         pos[i][j]=mid;
    53                     }
    54                 }
    55             }
    56         }
    57     }
    58     public static void main(String[] args){
    59         Scanner sc = new Scanner(System.in);
    60         //String temp=null;
    61         BracketsSequence1141 A=new BracketsSequence1141();
    62         s=sc.nextLine().toCharArray();
    63         if(s.length==0){
    64             System.out.println();
    65         }
    66         else{
    67             A.getDP();
    68             A.print(0,s.length-1);
    69         }    
    70     }    
    71 }
  • 相关阅读:
    【Cocos2d-x】VS2012开发2dx无法解析的外部符号解决记录(第一篇)【转】
    【实用技巧】取消Win7开机账户的手动选择
    Windows环境下面搭建Object C开发环境[转]
    Objective C for Windows
    一个3D的多人在线游戏, 服务端 + 客户端 【转】
    windows下搭建学习objective-c 的运行环境【转载】
    黑苹果安装
    面向对象的几个概念
    object-c学习1
    Objective-C在windows开发环境的搭建
  • 原文地址:https://www.cnblogs.com/1996313xjf/p/6617639.html
Copyright © 2011-2022 走看看