一、题目内容
【题目描述】
题目大意:给你一串()[]括号,要你求出这串括号的最大匹配个数,如’(‘与’)’匹配,为2个,’[‘与’]’匹配,为2个,其他不能匹配…….
【输入格式】
输入有多组样例,每组样例为一行字符,end时结束。
【输出格式】
每个样例输出一个答案,占一行
【输入样例】
((()))
()()()
([]])
)[)(
([][][)
end
【输出样例】
6
6
4
0
6
【测试网站】
二、题目分析
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)…..
注意有多组数据,dp数组不能开得太大,开2000*2000 TLE了
三、代码示例
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 1000 + 10;
int dp[maxn][maxn];
int main()
{
char str[maxn];
while(~scanf("%s",str) && str[0] != 'e')
{
int n = strlen(str);
// dp[i][j] = max(dp[i+1][j-1] + 1, dp[i+1][j], dp[i][j-1]);
memset(dp,0,sizeof(dp));
for(int i = n-1; i >= 0; i--)
for(int j = i+1; j < n; j++)
{
if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))
dp[i][j] = max(dp[i][j],dp[i+1][j-1]+1);
for(int k = i+1; k < j; k++)
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k][j]);
}
printf("%d\n",2*dp[0][n-1]);
}
return 0;
}