uva 1626 - Brackets sequence dp(区间,坑题, 难度适中,难ac)

来源:互联网 发布:网络机顶盒双人游戏 编辑:程序博客网 时间:2024/06/05 22:49


题目


这个题输入很坑,首先各种空格输入输出,然后样例还只有一组。


输入:先输入T,表示有T组数据。

         然后每组有两行组成,第一行是空串,第二行是字符串(可能是空串)。

输出:除了答案之外,答案与答案之间要空一行。



#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<vector>using namespace std;#define all(x) (x).begin(), (x).end()#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)typedef long long ll;typedef pair<int, int> pii;const int INF =0x3f3f3f3f;const int maxn= 100     ;char s[maxn+10];int n,dp[maxn+5][maxn+5];bool match(char x,char y){    return  x=='('&&y==')'||x=='['&&y==']';}void printchar(char x){    if(x=='('||x==')')  printf("()");    else if(x=='['||x==']')  printf("[]");}void print(int le,int ri){    if(le>ri)    {        return;    }    if(le==ri)    {        printchar(s[le]);        return;    }    if(match(s[le],s[ri])&&dp[le][ri]==dp[le+1][ri-1])    {        putchar(s[le]);        print(le+1,ri-1);        putchar(s[ri]);        return;    }   int best=-1;   for(int k=le+1;k<=ri;k++)   {       if(dp[le][k-1]+dp[k][ri]==dp[le][ri])       {           best=k;           break;       }   }   print(le,best-1);   print(best,ri);}int main(){    int T;scanf("%d",&T);getchar();    int kase=0;    while(T--)    {        getchar();//每次输入之前都有空行       gets(s+1);//不能用scanf,因为有空串        n=strlen(s+1);        for(int i=1;i<=n;i++)        {            dp[i][i]=1;        }        for(int add=1;add<n;add++)        {            for(int le=1;le+add<=n;le++)            {                int ri=le+add;                dp[le][ri]=INF;                if(match(s[le],s[ri]))                {                    dp[le][ri]=dp[le+1][ri-1];                }                for(int k=le+1;k<=ri;k++)                {                    dp[le][ri]=min(dp[le][ri],dp[le][k-1]+dp[k][ri]);                }            }        }        if(kase++) putchar('\n');//输出与输出之间有空行        print(1,n);putchar('\n');//        printf("%d\n",dp[1][n]);    }   return 0;}


0 0
原创粉丝点击