题意:
由‘(’ , ‘)’ , ‘[’ , ‘]’组成的字符串s,输出满足括号匹配原则的子串的最大长度。
题解:
1.dp[i][j]表示[i , j]这个区间内满足括号匹配原则的子串的最大长度。
2.假如s[l] = s[r] ,dp[l][r] = max(dp[l][r] , dp[l + 1][r - 1] + 2)。
3.然后用j遍历[l , r - 1]的点,dp[l][r] = max(dp[l][r] , dp[l][j] + dp[j + 1][r])。
4.最外层的循环是区间长度,随着区间长度的增大,最终获得想要的答案。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 105
using namespace std ;
int main()
{
int i , j , k , l , r ;
int len ;
int dp[N][N] ;
char s[N] ;
while(scanf("%s" , s) && s[0] != 'e')
{
memset(dp , 0 , sizeof(dp)) ;
len = strlen(s) ;
for(i = 0 ; i < len - 1 ; i ++)
if(s[i] == '(' && s[i + 1] == ')' || s[i] == '[' && s[i + 1] == ']')
dp[i][i + 1] = 2 ;
for(i = 2 ; i < len ; i ++) //i控制长度
for(l = 0 ; l + i < len ; l ++)
{
r = l + i ;
if(s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']')
dp[l][r] = max(dp[l][r] , dp[l + 1][r - 1] + 2) ;
for(j = l ; j < r ; j ++)
dp[l][r] = max(dp[l][r] , dp[l][j] + dp[j + 1][r]) ;
}
printf("%d\n" , dp[0][len - 1]) ;
}
}