poj 1141 Brackets Sequence 完全括号匹配

28 篇文章 0 订阅

这个题真的写死我了……本来弱菜写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;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值