POJ2955 Brackets(区间DP)
给一个括号序列,求有几个括号是匹配的。
- dp[i][j]表示序列[i,j]的匹配数
- dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配)
- dp[i][j]=max(dp[i][k]+dp[k+1][j])(i<=k<j)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char str[111]; 6 int d[111][111]; 7 int main(){ 8 while(~scanf("%s",str) && str[0]!='e'){ 9 int n=strlen(str); 10 memset(d,0,sizeof(d)); 11 for(int len=2; len<=n; ++len){ 12 for(int i=0; i+len<=n; ++i){ 13 if(str[i]=='('&&str[i+len-1]==')' || str[i]=='['&&str[i+len-1]==']') d[i][i+len-1]=d[i+1][i+len-2]+2; 14 for(int j=0; j<len-1; ++j) d[i][i+len-1]=max(d[i][i+len-1],d[i][i+j]+d[i+j+1][i+len-1]); 15 } 16 } 17 printf("%d\n",d[0][n-1]); 18 } 19 return 0; 20 }