poj 1141 Brackets Sequence

#include<iostream>
#include
<string>
#define max 9999
using namespace std;
char s[110];
int ans[110][110],pipei[110][110];

void output(int x,int y)
{
if(x>y) return ;
else if(x==y)
{
if(s[x]=='('||s[x]==')')
printf(
"()");
else
printf(
"[]");
}
else
{
if(pipei[x][y]==-1)
{
printf(
"%c",s[x]);
output(x
+1,y-1);
printf(
"%c",s[y]);
}
else
{
output(x,pipei[x][y]);
output(pipei[x][y]
+1,y);
}
}
}
int main()
{
while(gets(s))
{
int dis,k,i,j;
int len=strlen(s);
if(!len)
{
printf(
"\n"); continue;
}
memset(ans,
0,sizeof(ans));
for(i=0;i<len;i++)
ans[i][i]
=1; //ans[i][i]表示只有一个字符如 ] 则它只需添加1个字符匹配后变成 [ ] ,所以是1
for(dis=1;dis<len;dis++)
for(i=0;i<len-dis;i++)
{
j
=i+dis;
ans[i][j]
=max;
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) //当s[i]与s[j]匹配时,ans[i,j]=ans[i+1,j-1].此时pipei[i][j]标记为-1
ans[i][j]=ans[i+1][j-1],pipei[i][j]=-1;
for(k=i;k<j;k++) //在i->j找出使(ans[i,k]+ans[k+1,j])最小的K,ans[i,j]=ans[i,k]+ans[k+1,j].
{
if(ans[i][k]+ans[k+1][j]<ans[i][j])
ans[i][j]
=ans[i][k]+ans[k+1][j],pipei[i][j]=k;
}
}
output(
0,len-1);
printf(
"\n");
}
return 0;
}

  

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/07/17/2109003.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值