POJ 1141 Brackets Sequence ( 区间DP )

来源:互联网 发布:asp.net core php 编辑:程序博客网 时间:2024/04/30 06:02
题意:给一组小括号与中括号的序列,添加最少的字符,使该序列变为合法序列,输出该合法序列。 

分析:设dp[i,j]为从位置i到位置j需要加入字符的最小次数,有dp[i,j]=min(dp[i,k]+dp[k+1,j]),其中i<=k<j。特别的当s[i]='[' s[j]=']'或者s[i]='(' s[j]=')'时,dp[i,j]=dp[i+1,j-1]。初始条件为dp[i,i]=1,其中0<=i<len。

//256K16MS#include <cstdio>#include <iostream>#include <cstring>#include <climits>#define N 110using namespace std ;char str[N] ;int dp[N][N] ;  //dp[i][j]表示从位置i到位置j学要加入字符的最小次数int path[N][N] ;    //记录输出相关路径voidOutput ( int const start , int const end ){    if ( start > end )    {        return ;    }    else if ( start == end )    {        if ( '[' == str[start] || ']' == str[start] )        {            printf ("[]") ;        }        else        {            printf ("()") ;        }    }    else if ( -1 == path[start][end] )    {        printf ("%c" , str[start] ) ;        Output ( start + 1 , end - 1 ) ;        printf ("%c" , str[end] ) ;    }    else    {        Output ( start , path[start][end] ) ;        Output ( path[start][end] + 1  , end ) ;    }}voidResart_DP ( ){    for ( int i = 0 ; i < N ; i ++ )    {        for ( int j = 0 ; j < N ; j ++ )        {            dp[i][j] = 0 ;        }    }}voidSet_DP ( int const n ){    for ( int i = 0 ; i < n ; i ++ )    {        dp[i][i] = 1 ;      //初始化时dp[i][i] = 1    }}voidSolve ( ){    int n ;         //n代表字符串长度    n = strlen ( str ) ;    Resart_DP ( ) ;    //初始化相关信息    Set_DP ( n ) ;    for ( int r = 1 ; r < n ; r ++ )    {        for ( int i = 0 ; i < n - r ; i ++ )        {            int j ;            j = i + r ;            dp[i][j] = INT_MAX ;            if ( ('(' == str[i] && ')' == str[j] ) || ('[' == str[i] && ']'== str[j] ) )            {                if ( dp[i][j] > dp[i+1][j-1] )                {                    dp[i][j] = dp[i+1][j-1] ;                    path[i][j] = -1 ;                }            }            for ( int k = i ; k < j ; k ++ )            {                if ( dp[i][j] > dp[i][k] + dp[k+1][j] )                {                    dp[i][j] = dp[i][k] + dp[k+1][j] ;                    path[i][j] = k ;                }            }        }    }    Output ( 0 , n - 1 ) ;    printf ("\n") ;    return ;}intmain ( ){    while ( gets(str ) )    {        Solve ( ) ;    }    return 0 ;}


原创粉丝点击