//============================================================================
// Name : 1141.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
typedef struct data {
int step;
int last;
} Data;
int ok(char a, char b) {
return (a == '(' && b == ')') || (a == '[' && b == ']');
}
string stra("()");
string strb("[]");
string& haha(char c){
if (c==')' || c=='('){
return stra;
}else{
return strb;
}
}
void pt(string& str, Data ** d, int i, int j) {
int last= d[i][j].last;
if (last == -1) {
if (i==1){
cout<< haha(str[j]);
}
}else if (last == -2){
cout <<str[j];
pt(str,d,i-2,j+1);
cout << str[j+i-1];
}else{
pt(str,d,last,j);
pt(str,d,i-last,j+last);
}
}
int main() {
string str;
cin >> str;
Data** d;
int len = str.length();
d = new Data*[len + 1];
for (int i = 0; i <= len; i++) {
d[i] = new Data[len + 1 - i];
}
for (int i = 0; i <= len; i++) {
d[0][i].step = 0;
d[0][i].last = -1;
}
for (int i = 0; i < len; i++) {
d[1][i].step = 1;
d[1][i].last = -1;
}
for (int i = 2; i <= len; i++) {
for (int j = 0; j <= len - i; j++) {
int min = 1000000000;
int last = -3;
if (ok(str[j], str[j + i -1])) {
if (min > d[i-2][j + 1].step) {
min = d[i-2][j + 1].step;
last = -2;
}
}
for (int k = 1; k < i; k++) {
int ns = d[k][j].step + d[i - k][j + k].step;
if (min > ns) {
min = ns;
last = k;
}
}
d[i][j].step = min;
d[i][j].last = last;
}
}
pt(str,d,len,0);
cout<<endl;
return 0;
}
poj1141
最新推荐文章于 2017-07-13 17:14:12 发布