题意:
题目背景:
我们将正规括号序列定义如下:
空序列是正规括号序列。
如果S是一个正规括号序列,那么(S)和[S]都是正规括号序列。
如果A和B都是正规括号序列,那么AB是一个正规括号序列。
例如,下面这些序列都是正规括号序列:
(),[],(()),([]),()[],()[()]
而下面这些不是正规括号序列:
(,[,),)(,([)],([]
题目描述:
给你一些含有字符’(’,’)’,’[‘和’]'的括号序列。你需要找一个最短的正规括号序列,使给定括号序列作为一个子序列包含在其中。
输入描述:
输入第一行为一个正整数,代表数据组数。每组数据内容见下文。这一行之后跟着一个空行,每两组数据中间也有一个空行。
每组输入都为一行,最多包含100个括号(字符’(’,’)’,’[‘和’]’),每两个括号之间没有空格。
输出描述:
对于每一组数据,格式必须符合如下:
输出最短的括号序列,满足题目描述,并且每两个输出之间必须有一个空行分开(最后一行没有)。
输入样例:
1
([(]
输出样例:
()[()]
解:
1.首先注意读入方式getchar() 吃掉空格;由于输入的串可能是空串,则需要用getline的字符串读入方式。getline不会读入行尾换行符。
2.递归打印
3.状态来自两种转移方式:(1)相同
(2)两个子字符串
详情参加算法竞赛入门(第二版)p278
AC代码如下:
#include <iostream>
#include<cstring>
#include<cstdio>
#include<string>
#define INF 2147483640;
using namespace std;
string op;
char a;
int dp[505][505];
int match(char x, char y){
if(x == '[' && y == ']') return 1;
if(x == '(' && y == ')') return 1;
return 0;
}
void print(int i,int j){
if(i == j