這個題真的寫死我了……本來弱菜寫dp就費勁,開始用的string的+來連接兩個字符串,又用的insert以及append,用g++交各種TLE,c++各種各種CE,最後就想隨便改成char的,用strcat吧,結果就過了,才47ms,雖然也沒有很快,可是string就有那麼慢………………還是我寫的太挫了………………
註釋掉的代碼就不去掉了,留着,紀念…………
題意:給定一些【】與(),讓加入最少的括號使整個串的括號匹配,並輸出最後匹配的字符串
黑書裏的dp,用記憶化搜索寫的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF= 0x7f7f7f7f;
struct node{
int add;
char str[205];
}dp[105][105];
char ch[105];
int len;
void dfs(int x, int y){
if( dp[x][y].add != INF) return;
else if( x > y) {
dp[x][y].add= 0;
return ;
}
else if( x== y) {
dp[x][y].add= 1;
if( ch[x]== '(' || ch[x] == ')')
dp[x][y].str[0]= '(', dp[x][y].str[1]= ')', dp[x][y].str[2]= '\0';// = "()";
else dp[x][y].str[0]= '[', dp[x][y].str[1]= ']', dp[x][y].str[2]='\0';// = "[]";
return ;
}
int flag= 0, mm= dp[x][y].add;
if( (ch[x]== '(' && ch[y] == ')') ){
dfs(x+1, y-1);
if( mm > dp[x+1][y-1].add){
mm= dp[x+1][y-1].add;
flag= 1;
}
}
else if((ch[x]== '[' && ch[y]==']')){
dfs(x+1, y-1);
if( mm > dp[x+1][y-1].add){
flag= 2;
mm= dp[x+1][y-1].add;
}
}
else if( ch[x] == '(' || ch[x] == '['){
dfs(x+1, y);
if( mm > dp[x+1][y].add + 1){
mm= dp[x+1][y].add + 1;
flag= 3;
}
}
else if( ch[y] == ')' || ch[y] == ']'){
dfs( x, y-1);
if( mm > dp[x][y-1].add + 1){
mm= dp[x][y-1].add + 1;
flag = 4;
}
}
int mm1= mm;
int tmp= -1;
for( int k= x; k<y; k++){
dfs(x, k);
dfs(k+1, y);
if( mm1 > ( dp[x][k].add + dp[k+1][y].add)){
mm1= dp[x][k].add + dp[k+1][y].add;
tmp = k;
}
}
if( mm <= mm1){
if( flag != 0){
dp[x][y].add= mm;
if( flag== 1){
dp[x][y].str[0]= '(';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x+1][y-1].str);
strcat(dp[x][y].str, ")");
//dp[x][y].str.insert(0, "(");
// dp[x][y].str.insert(1, dp[x+1][y-1].str);
// dp[x][y].str.append(")");
// dp[x][y].str="(" + dp[x+1][y-1].str + ")" ;
}
else if( flag == 2) {
dp[x][y].str[0]= '[';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x+1][y-1].str);
strcat(dp[x][y].str, "]");
// dp[x][y].str.insert(0, "[");
// dp[x][y].str.insert(1, dp[x+1][y-1].str);
// dp[x][y].str.append("]");
// dp[x][y].str= "[" + dp[x+1][y-1].str + "]";
}
else if( flag == 3){
if( ch[x] == '(') {
dp[x][y].str[0]= '(';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x+1][y].str);
strcat(dp[x][y].str, ")");
// dp[x][y].str.insert(0, "(");
// dp[x][y].str.insert(1, dp[x+1][y].str);
// dp[x][y].str.append(")");
//dp[x][y].str= "(" + dp[x+1][y].str +")";
}
else {
dp[x][y].str[0]= '[';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x+1][y].str);
strcat(dp[x][y].str, "]");
// dp[x][y].str.insert(0, "[");
// dp[x][y].str.insert(1, dp[x+1][y].str);
// dp[x][y].str.append("]");
//dp[x][y].str = "[" + dp[x+1][y].str + "]";
}
}
else if( flag== 4){
if( ch[y] == ')') {
dp[x][y].str[0]= '(';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x][y-1].str);
strcat(dp[x][y].str, ")");
// dp[x][y].str.insert(0, "(");
// dp[x][y].str.insert(1, dp[x][y-1].str);
// dp[x][y].str.append(")");
// dp[x][y].str= "(" + dp[x][y-1].str + ")";
}
else {
dp[x][y].str[0]= '[';
dp[x][y].str[1]= '\0';
strcat(dp[x][y].str, dp[x][y-1].str);
strcat(dp[x][y].str, "]");
//dp[x][y].str.insert(0, "[");
// dp[x][y].str.insert(1, dp[x][y-1].str);
// dp[x][y].str.append("]");
// dp[x][y].str = "[" + dp[x][y-1].str + "]";
}
}
}
}
else if( tmp != -1){
dp[x][y].add= mm1;
strcat(dp[x][y].str, dp[x][tmp].str );
strcat(dp[x][y].str, dp[tmp+1][y].str);
// dp[x][y].str.insert(0, dp[x][tmp].str);
// dp[x][y].str.append(dp[tmp+1][y].str);
//dp[x][y].str = dp[x][tmp].str + dp[tmp+1][y].str;
}
}
int main(){
//freopen("1.txt", "r", stdin);
int i, j, k;
while( gets(ch)){
len= strlen(ch);
if( len == 0){
printf("\n");
continue;
}
for( i= 0; i<len; i++){
for( j= 0; j<len; j++){
dp[i][j].add= INF;
dp[i][j].str[0]= '\0';
}
}
dfs(0, len-1);
printf("%s\n", dp[0][len-1].str);
// cout<<dp[0][len-1].str<<endl;
}
return 0;
}