题目链接:http://poj.org/problem?id=2955
Brackets
Description We give the following inductive definition of a “regular brackets” sequence:
For instance, all of the following character sequences are regular brackets sequences:
while the following character sequences are not:
Given a brackets sequence of characters a1a2 …an, your goal is to find the length of the longest regular brackets sequence that is a subsequence ofs. That is, you wish to find the largestm such that for indicesi1,i2, …,im where 1 ≤i1 <i2 < … <im ≤n, ai1ai2 … aim is a regular brackets sequence. Given the initial sequence Input The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters Output For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line. Sample Input Sample Output Source
|
题意:求最大括号匹配数,( )、[ ].
若i、j不匹配,则dp[i][j] = dp[i+1][j];若i、j匹配,则dp[i][j] = max{dp[i][k] + dp[k+1][j]}+2.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[110];
int dp[110][110];
int main()
{
while(~scanf("%s", s + 1) && s[1] != 'e') {
int l = strlen(s + 1);
memset(dp, 0, sizeof(dp));
for(int i = l - 1; i >= 1; i --)
for(int j = i + 1; j <= l; j ++)
{
dp[i][j] = dp[i + 1][j];
for(int k = i + 1; k <= j; k ++)
{
if(s[i] == '(' && s[k] == ')' || s[i] == '[' && s[k] == ']')
dp[i][j] = max( dp[i][j], dp[i + 1][k - 1] + dp[k + 1][j] + 2);
}
}
printf("%d\n", dp[1][l]);
}
return 0;
}