【URAL 1183】Brackets Sequence(区间DP+路径记录)

来源:互联网 发布:nginx检查配置文件 编辑:程序博客网 时间:2024/06/06 11:43

【URAL 1183】Brackets Sequence(区间DP+路径记录)

题目大意:定义合法的匹配括号不可交叉。
问将给出的括号串变为合法匹配至少需要添加多少括号,输出转换出的合法匹配括号串。

只问最少添加数量用区间DP可以搞。
dp[i][j]=dp[i+1][j]+1(str[i])
dp[i][j]=min(dp[i+1][k1]+dp[k+1][j])  (str[i]str[k])

然后要输出的话,在DP过程中记录一下匹配情况就好。然后递归输出

代码如下:

#include <iostream>#include <cmath>#include <vector>#include <cstdlib>#include <cstdio>#include <climits>#include <ctime>#include <cstring>#include <queue>#include <stack>#include <list>#include <algorithm>#include <map>#include <set>#define LL long long#define Pr pair<int,int>#define fread(ch) freopen(ch,"r",stdin)#define fwrite(ch) freopen(ch,"w",stdout)using namespace std;const int INF = 0x3f3f3f3f;const int msz = 10000;const int mod = 1e9+7;const double eps = 1e-8;const int maxn = 123;char str[maxn];int dp[2][maxn][maxn];void prt(int l,int r){    if(l > r) return;    if(dp[1][l][r] == -1)    {        if(str[l] == '(' || str[l] == ')') printf("()");        else printf("[]");        prt(l+1,r);    }    else    {        putchar(str[l]);        prt(l+1,dp[1][l][r]-1);        putchar(str[dp[1][l][r]]);        prt(dp[1][l][r]+1,r);    }}int main(){    //fread("");    //fwrite("");    int n;    scanf("%s",str);    n = strlen(str);    memset(dp,0,sizeof(dp));    for(int len = 1; len <= n; ++len)    {        for(int i = 0,j = i+len-1; j < n; ++i,++j)        {            dp[0][i][j] = dp[0][i+1][j]+1;            dp[1][i][j] = -1;            for(int k = i+1; k <= j; ++k)            {                if((str[i] == '(' && str[k] == ')') || (str[i] == '[' && str[k] == ']'))                    if(dp[0][i][j] > dp[0][i+1][k-1]+dp[0][k+1][j])                    {                        dp[0][i][j] = dp[0][i+1][k-1]+dp[0][k+1][j];                        dp[1][i][j] = k;                    }            }        }    }    prt(0,n-1);    return 0;}
0 0
原创粉丝点击