码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1141 区间dp+递归打印路径

时间:2016-08-17 12:05:45      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
//#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
const int inf = 0x3f3f3f3f;
char s[maxn];
int dp[maxn][maxn],choose[maxn][maxn];
void printstr(int i,int j)
{
    if(i>j)
        return ;
    if(i==j)
    {
        if(s[i]==(||s[i]==)) printf("()");
        else printf("[]");
        return;
    }
    if(choose[i][j]==-1)
    {
        printf("%c",s[i]);
        printstr(i+1,j-1);
        printf("%c",s[j]);
    }
    else
    {
        printstr(i,choose[i][j]);
        printstr(choose[i][j]+1,j);
    }
}
int main()
{
    int t;
    //scanf("%d",&t);
    cin>>s;

        int len =strlen(s);
        for(int i=0; i<len; i++)
            dp[i][i]=1,dp[i+1][i]=0;
        for(int p=1; p<len; p++)
        {
            for(int i=0,j=i+p; j<len; i++,j++)
            {
                dp[i][j]=inf;
                choose[i][j]=-1;
                if(s[i]==(&&s[j]==)||s[i]==[&&s[j]==])
                    dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
                for(int k=i; k<j; k++)
                {
                    if(dp[i][j]>dp[i][k]+dp[k+1][j])
                    {
                        choose[i][j]=k;
                        dp[i][j]=dp[i][k]+dp[k+1][j];
                    }
                }
            }
        }
        printstr(0,len-1);
        printf("\n");
    return 0;
}
View Code

 

poj 1141 区间dp+递归打印路径

标签:

原文地址:http://www.cnblogs.com/superxuezhazha/p/5779168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!