POJ
来源:互联网 发布:编译php strip tags 编辑:程序博客网 时间:2024/06/11 17:32
Brackets
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8536 Accepted: 4553
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
题意:
给定一个括号序列,让你求左右匹配的最长括号子序列
可以想到,对于一个区间L,R括号的组合形式必然为(……)(……)或者(),[]同理,那么我们枚举中间断开的k点,DP[L][R]=max{DP[L][K]+DP[K+1][R]},L<=K
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100+5;char s[maxn];int dp[maxn][maxn];int main(){ while(~scanf("%s",s+1)) { if(s[1]=='e')break; int n=strlen(s+1); memset(dp,0,sizeof(dp)); for(int l=1;l<=n;++l) { for(int i=1;i+l-1<=n;++i) { int L=i,R=i+l-1; if((s[L]=='('&&s[R]==')')||(s[L]=='['&&s[R]==']')) dp[L][R]=dp[L+1][R-1]+2; for(int k=L;k<R;++k) dp[L][R]=max(dp[L][R],dp[L][k]+dp[k+1][R]); } } printf("%d\n",dp[1][n]); } return 0;}
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- Java邮件开发(二):使用JMail发送一封图文并茂且包含附件的邮件(下)
- 平常水题 Educational Codeforces Round 26 C (错误总结)
- zxing 制作扫描二维码
- 使用mybatis 产生Invalid bound statement (not found)错误原因
- 13.IDA-显示正确的函数名称(去掉c++后缀命名)
- POJ
- Odoo10
- HDU 6073 Matching In Multiplication (拓扑+DFS, 2017 Multi-Univ Training Contest 4)
- 自实现观察者模式(发布/订阅模式)的一个隐藏bug
- Python之lambda匿名函数及map用法
- ireport 合并行
- Go语言之MySQL增删改查
- Swift UIViewController中的delegate方式传值
- Android内存泄漏分析及调试