题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=15
代码如下:
01.
#include<stdio.h>
02.
#include<string.h>
03.
#include<algorithm>
04.
using
namespace
std;
05.
char
str[105];
06.
int
dp[105][105];
07.
int
main()
08.
{
09.
int
icase;
10.
scanf
(
"%d"
,&icase);
11.
while
(icase--)
12.
{
13.
scanf
(
"%s"
,str);
14.
int
len=
strlen
(str);
15.
memset
(dp,0,
sizeof
(dp));
16.
for
(
int
i=1;i<len;i++)
//枚举所有长度的子串
17.
for
(
int
j=0,k=i;k<len;j++,k++)
18.
{
19.
if
(str[j]==
'('
&&str[k]==
')'
||str[j]==
'['
&&str[k]==
']'
)
20.
dp[j][k]=dp[j+1][k-1]+2;
21.
for
(
int
p=j;p<k;p++)
//匹配完之后还要更新dp[j][k]的值
22.
dp[j][k]=max(dp[j][k],dp[j][p]+dp[p+1][k]);
23.
}
24.
printf
(
"%d\n"
,len-dp[0][len-1]);
25.
}
26.
return
0;
27.
}