poj 1141 Brackets Sequence(区间DP,求最小,输出路径,较难)

1、http://poj.org/problem?id=1141

2、题目大意

给出一个字符串,只包含()[]四种符号,添加最少的符号使得该字符串有序,跟前面做的括号的问题类似,上次是求字符串中有规律的子串的最长长度,这次是求最少添加多少字符使得有序,并且输出最终有序的字符串来

dp[i][j]表示i到j区间内字符有序添加的最小值,

if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]

else

   dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

3、AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 105
char s[N];
int dp[N][N];
int v[N][N];
int check(char a,char b)
{
    if(a=='(' && b==')')
        return 1;
    if(a=='[' && b==']')
        return 1;
    return 0;
}
void output(int l,int r)
{
    if(l>r)
        return ;
    if(l==r)
    {
        if(s[l]=='(' || s[l]==')')
            printf("()");
        else
            printf("[]");
        return ;
    }
    if(v[l][r]==-1)
    {
        printf("%c",s[l]);
        output(l+1,r-1);
        printf("%c",s[r]);
        return ;
    }
    output(l,v[l][r]);
    output(v[l][r]+1,r);
}
int main()
{
    //while(scanf("%s",s)!=EOF)
    //{
    //while多次输入wrong answer
    scanf("%s",s);
    int len=strlen(s);
    memset(dp,-1,sizeof(dp));
    memset(v,-1,sizeof(v));
    for(int i=0; i<len; i++)
    {
        dp[i][i]=1;
        dp[i+1][i]=0;
    }
    for(int i=1; i<len; i++)
    {
        for(int j=0; j+i<len; j++)
        {
            int e=j+i;
            if(check(s[j],s[e]))
                dp[j][e]=dp[j+1][e-1];
            for(int k=j; k<e; k++)
            {
                if(dp[j][e]>dp[j][k]+dp[k+1][e] || dp[j][e]==-1)
                {
                    v[j][e]=k;
                    dp[j][e]=dp[j][k]+dp[k+1][e];
                }
            }
        }
    }
    output(0,len-1);
    printf("\n");
    //}
    return 0;
}

4、题目:


Brackets Sequence
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 23444   Accepted: 6595   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

()[()]

Source

Northeastern Europe 2001

 

 

Brackets Sequence
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 23444   Accepted: 6595   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

()[()]

Source

Northeastern Europe 2001

 

你可能感兴趣的:(poj 1141 Brackets Sequence(区间DP,求最小,输出路径,较难))