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

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

2016-07-03 22:55 519 查看
题目

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

输入:先输入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]
);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: