题目链接: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 }