一、题目描述
We give the following inductive definition of a “regular brackets” sequence:
the empty sequence is a regular brackets sequence,
if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and
if a and b are regular brackets sequences, then ab is a regular brackets sequence.
no other sequence is 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 of s. That is, you wish to find the largest m such that for indices i1, i2, …, im where 1 ≤ i1 < i2 < … < im ≤ n, ai1ai2 … aim is a regular brackets sequence.
Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].
Input
The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters (, ), [, and ]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.
Output
For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.
Sample Input
((()))
()()()
([]])
)[)(
([][][)
end
Sample Output
6
6
4
0
6
二、思路概述
-
题意为,给定一个括号序列,找到它的长度最大的合法的子序列(合法表示这个序列中的括号都相互对应)
-
dp[i][j]表示子序列[i,j]变成合法序列需要添加的最少括号的数量。
假如第 i 个和第 j 个是一对匹配的括号那么 dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
状态转移方程为dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ ff ] + dp [ ff+1 ] [ j ] ) 。 -
dp[i][j]的大小,可看是它原来的值比较大,还是[i,j]之间取个断点,两段的和比较大,用大的值进行更新。
三、完整代码
/* f[i][j]表示子序列[i,j]变成合法序列需要添加的最少括号的数量。
假如第 i 个和第 j 个是一对匹配的括号那么 dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ ff ] + dp [ ff+1 ] [ j ] ) 。
*/
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<map>
#include<queue>
using namespace std;
int f[110][110];
string str;
int main(){
while(1){
cin>>str;if(str.compare("end")==0)break;
memset(f,0,sizeof(f));
int j,k;
for(int i=1;i<str.length() ;i++){
for(j=0,k=i;k<str.length();k++,j++){
if(str[j]=='('&&str[k]==')')f[j][k]=f[j+1][k-1]+2;
else if(str[j]=='['&&str[k]==']')f[j][k]=f[j+1][k-1]+2;
for(int ff=j;ff<k;ff++){
f[j][k]=max(f[j][k],f[j][ff]+f[ff+1][k]);
}
}
}
cout<<f[0][str.length()-1]<<endl;
}
return 0;
}