[POJ 1141]Brackets Sequence(划分型动态规划)

题目:http://poj.org/problem?id=1141

题目大意:给出一组括号序列,要求加入最少的括号,使得每个括号都有与之对应的括号匹配

 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MAXN 1000
#define INF 0x3f3f3f3f

using namespace std;

int f[MAXN][MAXN];
int path[MAXN][MAXN]; //path[i][j]>0则表明[i,j]之间需要放个括弧,位置为path[i][j]
char s[MAXN];

int min(int a,int b)
{
    if(a<b) return a;
    return b;
}

bool match(char a,char b) //检查a括号和b括号是否匹配,是返回true
{
    if(a=='('&&b==')') return true;
    if(a=='['&&b==']') return true;
    return false;
}

void printBracket(int i,int j) //打印区间[i,j]的括号(递归输出)
{
    if(i>j) return;
    if(i==j)
    {
        if(s[i]=='['||s[i]==']') printf("[]");
        else printf("()");
    }
    else if(path[i][j]==0) //i、j的括号匹配,则转为打印[i+1,j-1]的括号
    {
        printf("%c",s[i]);
        printBracket(i+1,j-1);
        printf("%c",s[j]);
    }
    else
    {
        printBracket(i,path[i][j]);
        printBracket(path[i][j]+1,j);
    }
}

int main()
{
    while(gets(s+1))
    {
        memset(f,-1,sizeof(f));
        memset(path,-1,sizeof(path));
        int n=strlen(s+1); //n=括号字符串长度
        if(!n) //字符串为空
        {
            puts("");
            continue;
        }
        for(int i=1;i<=n;i++) //DP初始化
        {
            f[i][i-1]=0;
            f[i][i]=1;
        }
        for(int p=1;p<=n-1;p++) //两个括弧之间间隔为p
            for(int i=1;i<=n-p;i++) //左边括弧为i
            {
                int j=i+p; //右边括弧为j
                if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) //括弧i和j匹配,f[i][j]=min(f[i][j],f[i+1][j-1])
                {
                    f[i][j]=f[i+1][j-1];
                    path[i][j]=0;
                }
                for(int k=i;k<=j-1;k++) //无法匹配,则需要在i到j之间选一个k位置加一个括弧
                {
                    if(f[i][j]>f[i][k]+f[k+1][j]||f[i][j]==-1)
                    {
                        f[i][j]=f[i][k]+f[k+1][j];
                        path[i][j]=k;
                    }
                }
            }
        printBracket(1,n);
        puts("");
    }
    return 0;
}


 

 

 

 

你可能感兴趣的:([POJ 1141]Brackets Sequence(划分型动态规划))