您的位置:首页 > 产品设计 > UI/UE

poj 1141 Brackets Sequence 括号匹配

2012-11-10 16:42 309 查看
题目大意:给你一个字符串由(,),[,]组成,括号之间可以嵌套匹配

比如:

(), [], (()), ([]), ()[], ()[()] 这些是正确的匹配

(, [, ), )(, ([)], ([(] 这些是错误的匹配

要你求最少需要加多少个括号能补齐,输出补齐后的序列

解题思路:动态规划

dp[i][j]表示字符串系列i~j匹配,需要添加的最小括号数

path[i][j]用来保存分割点

dp[i][j] = min(dp[i][k] + dp[k + 1][j]), i<=k < j;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 110;

char str[maxn];
int dp[maxn][maxn], path[maxn][maxn], len;

void output(int st, int ed);

int main()
{
    
    memset(dp, 0, sizeof(dp));
    scanf("%s", str + 1);
    len = strlen(str + 1);
    for(int i = 1; i <= len; i++)
        dp[i][i] = 1;
    for(int l = 2; l <= len; l++)
    {
        for(int i = 1; i <= len - l + 1; i++)
        {
            int j = i + l - 1;
            if(str[i] == '(' && str[j] == ')' || str[i] == '[' && str[j] == ']')
            {
                dp[i][j] = dp[i+1][j-1];
                path[i][j] = -1;
            }
            else
                dp[i][j] = 0x7fffffff;
            for(int k = i; k <= j - 1; 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;
                }
            }
        }
    }
    output(1, len);
    printf("\n");
    
    return 0;
}

void output(int st, int ed)
{
    if(st > ed)
        return;
    else if(st == ed)
    {
        if(str[st] == '(' || str[ed] == ')')
            printf("()");
        else
            printf("[]");
    }
    else if(path[st][ed] == -1)
    {
        printf("%c", str[st]);
        output(st+1, ed - 1);
        printf("%c", str[ed]);
    }
    else
    {
        output(st, path[st][ed]);
        output(path[st][ed] + 1, ed);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: