poj 1141 Brackets Sequence 完全括號匹配

這個題真的寫死我了……本來弱菜寫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;
}


 

 

發佈了69 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章