UVA 1626 - Brackets sequence 区间DP

来源:互联网 发布:java全栈工程师是什么 编辑:程序博客网 时间:2024/05/22 06:06

题目:点击打开链接

题意:给你一个字符串,问至少添加多少个字符才能使它成为合法字符,具体的要求见题目,这道题在刘汝佳《算法竞赛入门经典第二版》278页有详细介绍

分析:我就不瞎扯了,书上写的很详细啊,需要注意的是输入串有可能是空串,用gets()接受一行字符串


#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int n,d[105][105];char s[105];bool match(char a,char b){    if((a=='['&&b==']')||(a=='('&&b==')'))        return 1;    return 0;}void dp(){    for(int i=0;i<n;i++){        d[i+1][i]=0;        d[i][i]=1;    }    for(int i=n-2;i>=0;i--)    for(int j=i+1;j<n;j++){        d[i][j]=n;        if(match(s[i],s[j]))d[i][j]=min(d[i][j],d[i+1][j-1]);        for(int k=i;k<j;k++)            d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);    }}void print(int i,int j){    if(i>j)return ;    if(i==j){        if(s[i]=='['||s[i]==']')printf("[]");        else printf("()");        return ;    }    int ans=d[i][j];    if(match(s[i],s[j])&&ans==d[i+1][j-1]){        printf("%c",s[i]);        print(i+1,j-1);        printf("%c",s[j]);        return;    }    for(int k=i;k<j;k++)    if(ans==d[i][k]+d[k+1][j]){        print(i,k);print(k+1,j);        return;    }}int main(){    int T;    scanf("%d",&T);    getchar();    while(T--){        gets(s);        gets(s);        n = strlen(s);        if(n==0){            printf("\n");            if(T>0) printf("\n");            continue;        }        dp();        print(0,n-1);        printf("\n");        if(T>0) printf("\n");    }    return 0;}


0 0
原创粉丝点击