poj 2955 Brackets

题目链接:http://poj.org/problem?id=2955

思路:括号匹配问题,求出所给序列中最长的可以匹配的长度(中间可以存在不匹配的)例如[(])]有[()]符合条件,长度为4

dp[i][j]代表从区间i到区间j所匹配的括号的最大个数,首先,假设不匹配,那么dp[i][j]=dp[i+1][j];然后查找i+1~~j有木有与第i个括号匹配的

有的话,dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2).....

 1 #include<cstdio>  
 2 #include<iostream>  
 3 #include<algorithm>
 4 #include<math.h> 
 5 #include<string.h>  
 6 #include<vector> 
 7 #include<queue>
 8 #include<iterator>
 9 #include<vector>
10 #include<set>
11 #define dinf 0x3f3f3f3f
12 typedef long long ll;
13 
14 using namespace std;
15 
16 char s[105];
17 int dp[105][105];
18 
19 int main()
20 {
21     while(scanf("%s",s+1) && s[1]!='e')
22     {    
23         s[0]=2;  //以下3行注意顺序 
24         int len=strlen(s);
25         len--;
26         memset(dp,0,sizeof(dp));
27         for(int i=len-1;i>=1;i--)
28         {
29             for(int j=i+1;j<=len;j++)
30             {
31                 dp[i][j]=dp[i+1][j];
32                 for(int k=i+1;k<=j;k++)
33                     if((s[i]=='(' && s[k]==')') || (s[i]=='[' && s[k]==']'))
34                         dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2);
35             }
36         }
37         printf("%d
",dp[1][len]);
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/pter/p/5726149.html