POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)

来源:互联网 发布:打车 数据 编辑:程序博客网 时间:2024/06/05 11:55

题目地址:POJ 1141
题意:给出一串由‘(‘)’‘ [ ’ ’ ] ‘组成的串,将给出的括号序列以添加最小数目括号的形式进行配对。
思路:dp[i][j]表示当前子序列需要添加的最小字符数,path存储的是所有子问题的解。然后详情看代码解释。

#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <sstream>#include <algorithm>#include <set>#include <queue>#include <stack>#include <map>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;typedef __int64  LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-7;const int Maxn=110;char str[Maxn];int path[Maxn][Maxn];//存储的是字符区间[i,j]之间的最佳中间位置int dp[Maxn][Maxn];void path_printf(int i,int j)//输出子序列[i,j]的括号方案{    if(i>j) return;//无效位置    if(i==j) {//子序列只有一个字符        if(str[i]=='['||str[i]==']')            printf("[]");        else if(str[i]=='('||str[i]==')')            printf("()");    } else if(path[i][j]==-1) {//区间[i,j]的最外层位置匹配,递归中间的序列        printf("%c",str[i]);        path_printf(i+1,j-1);        printf("%c",str[j]);    } else {//否则递归[i,k],[k+1,j]        path_printf(i,path[i][j]);        path_printf(path[i][j]+1,j);    }}int main(){    while(gets(str)) {        int len=strlen(str);        if(len==0) {//还有空行的时候,sad            printf("\n");            continue;        }        memset(dp,0,sizeof(dp));        for(int i=0; i<len; i++)//单个括号的匹配            dp[i][i]=1;        for(int r=1; r<len; r++) {//r代表递推子序列的长度            for(int i=0; i<len-r; i++) {//枚举子序列的开始位置                int j=i+r;//计算子序列的结束位置                dp[i][j]=inf;                if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']'))                    if(dp[i][j]>dp[i+1][j-1]) {                        dp[i][j]=dp[i+1][j-1];                        path[i][j]=-1;//表示括号i,j已经匹配了                    }                for(int k=i; k<j; k++)//枚举中间的最佳位置                    if(dp[i][j]>dp[i][k]+dp[k+1][j])                        dp[i][j]=dp[i][k]+dp[k+1][j],path[i][j]=k;            }        }        path_printf(0,len-1);        puts("");    }    return 0;}
1 0
原创粉丝点击