Brackets

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 14226 Accepted: 7476

Description

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

Source

Stanford Local 2004

#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
bool match(char a,char b);
#define mst(a,b) memset((a),(b),sizeof(a))
const int maxn=500;
int dp[maxn][maxn];
int main()
{
string ob;
while(cin>>ob)
{
if(ob=="end") break;
mst(dp,0);
for(int len=2;len<=ob.length( );len++){
for(int i=1;i<=ob.length( )+1-len;i++){
int j=len+i-1;
if(match(ob[i-1],ob[j-1])) dp[i][j]=dp[i+1][j-1]+2;
for(int k=i;k<j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
// for(int len=1;len<ob.length( )-2;len++) cout<<dp[len][len+3]<<' ';
cout<<dp[1][ob.length( )]<<endl;
}
}
bool match(char a,char b)
{
if(a=='('&&b==')') return 1;
if(a=='['&&b==']') return 1;
else return 0;
}

最新文章

  1. Module Zero之角色管理
  2. 一个简单的loading,纯属自娱自乐
  3. webfrrm基础
  4. 用OSSIM轻松分析网络设备日志
  5. matlab中使用fuzzy工具箱
  6. 键盘事件与JS Filter
  7. C++的常量折叠(三)
  8. CCIE-MPLS VPN-实验手册(下卷)
  9. [Wc2010]重建计划
  10. 【Qt编程】Qt学习之Window and Dialog Widgets
  11. Sqlserver中的视图
  12. Android Studio运行项目报错:Error:null value in entry: annotationProcessorOutputFolder=null的解决方案
  13. LeetCode 任务调度器-Python3&lt;八&gt;
  14. iOS 性能调优
  15. spring boot 学习(三)API注解记录及测试
  16. Subquery typo with using in(转)
  17. JDK下载安装以及环境变量的配置
  18. HDU 5167 Fibonacci 筛法+乱搞
  19. 学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换
  20. 20145322《Java程序设计》第5次实验报告

热门文章

  1. 路由与交换,cisco路由器配置,静态路由
  2. Node教程——API接口开发(MangoDB+Express)
  3. 震撼!全网第一张源码分析全景图揭秘Nginx
  4. tf.train.MomentumOptimizer 优化器
  5. CVE-2019-17671:wrodpress 未授权访问漏洞-复现
  6. 【python实现卷积神经网络】Flatten层实现
  7. 生成3D多棱柱的方法(3D立体图片)
  8. Python队列的三种队列方法
  9. 【Java】InnerClass 内部类
  10. stand up meeting 1--11