POJ 2955 Brackets
来源:互联网 发布:js包装函数 编辑:程序博客网 时间:2024/06/05 20:06
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 ofs. That is, you wish to find the largest m such that for indicesi1, 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
66406
#include <stdio.h>#include <string.h>#include <algorithm>#define N 105using namespace std;char s[N];int dp[N][N];int l;int isok(char a,char b){ if(a=='(' && b==')') return 1; if(a=='[' && b==']') return 1; return 0;}int main(){ while(scanf("%s",s)>0&&s[0]!='e') { l=strlen(s); for(int i = 0; i<l; i++) { dp[i][i] = 0; if(isok(s[i],s[i+1])) dp[i][i+1] = 2; else dp[i][i+1] = 0; } for(int k = 3; k<=l; k++) { for(int i = 0; i+k-1<l; i++) { dp[i][i+k-1] = 0; if(isok(s[i],s[i+k-1])) dp[i][i+k-1] = dp[i+1][i+k-2]+2; for(int j = i; j<i+k-1; j++) dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]); } } printf("%d\n",dp[0][l-1]); } return 0;}
- DP poj 2955 Brackets
- poj 2955 brackets
- POJ 2955 Brackets
- POJ 2955 Brackets
- POJ 2955 Brackets
- poj 2955 Brackets
- POJ 2955 Brackets
- POJ 2955 Brackets
- poj 2955 Brackets
- POJ 2955 Brackets
- POJ 2955:Brackets
- POJ 2955 Brackets
- POJ 2955 brackets
- POJ 2955 Brackets
- POJ 2955 Brackets
- Brackets (poj 2955)
- poj 2955 Brackets
- POJ 2955 Brackets (基础)
- Retrofit﹕ java.net.SocketTimeoutException: failed to connect to /IPXXXXXXX
- 关于段错误和栈溢出的问题
- Unity3d笔记:如何实现不规则多边形按钮
- LightOJ 1336 Sigma Function(求1~n的因数和为偶数的个数)
- 第五篇:OC中特有的 点语法 对成员变量赋值与取值
- POJ 2955 Brackets
- Andrioid自定义标题栏
- 敏捷开发流程
- android入门(七) 消息提示toast和Context
- 2015年9月10日
- hdu1078
- STRHH - Half of the half
- 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
- Axure 动态效果的设置