佩服刘汝佳的思路。 模板还是那样。
但是能应用进去就是厉害。依旧二维数组 s【i】【j】 表示 i~ j 至少需要多少个来进行匹配。
在输出的时候用的递归 见了好多次 输出用递归的。 但是真的想不到啊。。
这题还有一个坑。 就是可能输入为空。 所以scanf 就不可以了 可以用 gets 。 还有每一个输入前面 都有一个空行。 要用 getchar 吸收掉。
输出 样例之间有空行 那就是UVA 的惯例了。。 习惯了。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define ll long long
#define maxn 100+10
#define INF 1<<30
vector <int> sons[maxn];
int dp[maxn][maxn];
char s[maxn];
void print(int i,int j){
if(i > j)
return ;
if(i == j){
if(s[i] == '(' || s[i] == ')')
printf("()");
else printf("[]");
return ;
}
int ans = dp[i][j];
if(((s[i] =='(' &&s[j] == ')' )||(s[i] =='[' &&s[j] == ']' ))&& ans == dp[i+1][j-1]){
printf("%c",s[i]);
print(i+1,j-1);
printf("%c",s[j]);
return ;
}
for(int k = i; k < j; k++){
if(ans == dp[i][k] + dp[k+1][j]){
print(i,k);print(k+1,j);
return ;
}
}
}
int main (){
int n;
int counts = 0;
scanf("%d",&n);
getchar();
while(n--){
getchar();
gets(s);
if(counts)
printf("\n");
counts++;
int len = strlen(s);
for(int i = 0; i < len; i++){
dp[i+1][i] = 0;
dp[i][i] = 1;
}
for(int i = len-2; i >= 0; i--){
for(int j = i+1; j < len; j++){
dp[i][j] = len;
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++)
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j]);
}
}
print(0,len-1);
printf("\n");
}
return 0;
}