标签:
求最大括号匹配
和上一题回文序列差不多,主要差别在于()()()这个样例上,因此需要在求区间过程再加一步,具体见代码
Sample Input
((())) ()()() ([]]) )[)( ([][][) end
Sample Output
6 6 4 0 6
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int dp[1001][1001]; 6 char a[1001]; 7 int n; 8 int main() 9 { 10 //freopen("1.in","r",stdin); 11 while(scanf("%s",a+1)!=EOF) 12 { 13 if(a[1]==‘e‘) break; 14 int n=strlen(a+1); 15 memset(dp,0,sizeof(dp)); 16 for(int len=1;len<n;len++) { 17 for (int i=1;i+len<=n;i++){ 18 int j=i+len; 19 if((a[i]==‘(‘&&a[j]==‘)‘)||(a[i]==‘[‘&&a[j]==‘]‘)) 20 dp[i][j]=dp[i+1][j-1]+2; 21 for(int t=i;t<=j;t++) 22 { 23 dp[i][j]=max(dp[i][t]+dp[t+1][j],dp[i][j]); 24 } 25 } 26 } 27 printf("%d\n",dp[1][n]); 28 } 29 return 0; 30 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4265592.html