区间dp
题目大意:给出一个的只有’(‘,’)’,’[‘,’]’四种括号组成的字符串,求最多有多少个括号满足匹配。
题目链接
思路:用dp[i][j]表示区间i~j的最大匹配数,对于dp[i][j] = dp[i + 1][j - 1] + (s[i]和s[j]匹配?2 : 0),开始时dp[i][j]均为0。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1e2 + 100;
char str[maxn];
int dp[maxn][maxn];
int main()
{
while(~scanf("%s", str) && strcmp(str, "end"))
{
memset(dp, 0, sizeof(dp));
int n = strlen(str);
for(int len = 2; len <= n; len++)
{
for(int i = 0; i < n; i++)
{
if(i + len - 1 > n) break;
int j = i + len - 1;
if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))
{
dp[i][j] = dp[i + 1][j - 1] + 2;
}
else dp[i][j]