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 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 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 ((())) ()()() ([]]) )[)( ([][][) end Sample Output 6 6 4 0 6 Source |
[Submit] [Go Back] [Status] [Discuss]
题意:给定一个只包含 ()[] 的序列,左右括号相互匹配,求最长匹配的长度
已经菜的抠脚重新开始写水题.....然而好多也不会写.....大菜鸡.....
定义状态dp[x][y]表示以x为起点y为终点的最长匹配长度,则状态转移为
当 j 和 i 正好匹配时 , 初始化 dp[ j ] [ i ] = dp [ j+1 ] [ i - 1 ] + 2 ,否则 初始化为 0
从 dp[x+1][ y ] , dp [ x ] [ y - 1 ] , dp[ x ] [ k ] + dp [ k+1 ] [ y ] 中转移较大的,k为x,y中间的部分
整个复杂度 n^3
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[105];
int dp[105][105];
inline bool check(int a,int b){
if(str[a]=='('&&str[b]==')'){
return true;
}if(str[a]=='['&&str[b]==']'){
return true;
}return false;
}
int main()
{
while(scanf("%s",str)==1){
if(strcmp(str,"end")==0){
break;
}memset(dp,0,sizeof(dp));
int n = strlen(str);
for(int i=1;i<n;i++){
int mx = 0;
for(int j=i-1;j>=0;j--){
if(check(j,i)){
dp[j][i] = dp[j+1][i-1] + 2;
}
dp[j][i]=max(max(dp[j][i],dp[j+1][i]),dp[j][i-1]);
for(int k=j+1;k<i;k++){
dp[j][i] = max(dp[j][i],dp[j][k]+dp[k+1][i]);
}
}
}
printf("%d\n",dp[0][n-1]);
}return 0;
}