给你一串括号,去掉最少的括号,使之合法化,输出合法化的长度。

按照题目的四个条件去找就行了,小问题的解可以求出答题的解

dp[i][j]=max(dp[i][k]+dp[k+1][j],dp[i-1][j-1]+2)

 1 #include"iostream"
 2 #include"cstring"
 3 #include"cstdio"
 4 using namespace std;
 5 int main()
 6 {
 7     char str[150];
 8     while(scanf("%s",str)!=EOF)
 9     {
10         if(str[0]=='e')
11             break;
12         int dp[150][150],i,j,k;
13         int len=strlen(str);
14         for(k=0;k<len;k++)  //增量放前   k=0用来初始化 
15         {
16             for(i=0;i+k<len;i++)
17             {
18                 int max=0;
19                 if(i==i+k)
20                 {
21                     dp[i][i+k]=0;
22                     continue;
23                 }
24                 if(str[i]=='('&&str[i+k]==')')
25                 {
26                     if(i+1>i+k-1&&max<2)
27                         max=2;
28                     if(i+1<=i+k-1)
29                     {
30                         if(max<dp[i+1][i+k-1]+2)
31                             max=dp[i+1][i+k-1]+2;
32                     }
33                 }
34                 if(str[i]=='['&&str[i+k]==']')
35                 {
36                     if(i+1>i+k-1&&max<2)
37                         max=2;
38                     if(i+1<=i+k-1)
39                     {
40                         if(max<dp[i+1][i+k-1]+2)
41                             max=dp[i+1][i+k-1]+2;
42                     }
43                 }
44                 for(j=1;j<=k;j++)
45                 {
46                     if(dp[i][i+j-1]+dp[i+j][i+k]>max)
47                         max=dp[i][i+j-1]+dp[i+j][i+k];
48                 } 
49                 dp[i][i+k]=max;
50             } 
51         }
52         printf("%d\n",dp[0][len-1]);
53     }
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/767355675hutaishi/p/3911497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值