首页 > 代码库 > hdu 2955

hdu 2955

求最大括号匹配

和上一题回文序列差不多,主要差别在于()()()这个样例上,因此需要在求区间过程再加一步,具体见代码

Sample Input

((()))()()()([]]))[)(([][][)end

Sample Output

66406

 

 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 }

 

hdu 2955