POJ 2955 Brackets (区间DP)
来源:互联网 发布:中兴刷机软件 编辑:程序博客网 时间:2024/05/17 03:11
Brackets
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 6420 Accepted: 3436
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 "cstring"#include "cstdio"#include "iostream"#include "string.h"#include "algorithm"using namespace std;char s[1005];int dp[1005][1005];bool check(int left,int right){ if(s[left]=='('&&s[right]==')') return true; if(s[left]=='['&&s[right]==']') return true; return false;}int main(){ while(scanf("%s",s)&&strcmp(s,"end")!=0) { int len=strlen(s); memset(dp,0,sizeof(dp)); //l表示区间长度。区间的长度可以从1~len for(int l=1;l<=len;l++) { //枚举该长度下的所有区间 for(int i=0;i+l-1<len;i++) { //若区间守卫可以构成一个匹配,那么答案就+2 if(check(i,i+l-1)) dp[i][i+l-1]=dp[i+1][i+l-2]+2; //合并区间 for(int j=i;j<i+l-1;j++) dp[i][i+l-1]=max(dp[i][i+l-1],dp[i][j]+dp[j+1][i+l-1]); } } printf("%d\n",dp[0][len-1]); }}
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets 【区间DP】
- POJ 2955 Brackets(区间DP)
- poj-2955 Brackets 区间dp
- POJ 2955 Brackets (区间dp)
- POJ 2955 Brackets 区间DP
- poj 2955 Brackets(区间dp)
- POJ 2955 - Brackets(区间DP)
- poj 2955 Brackets 区间dp
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets【区间DP】
- poj 2955 Brackets(区间dp)
- poj 2955 Brackets 区间DP
- poj 2955 Brackets 区间dp
- poj 2955 Brackets(区间dp)
- POJ 2955 Brackets 【区间DP】
- [区间dp] poj 2955 Brackets
- POJ 2955 Brackets(区间dp)
- error:LNK2005 已经在*.obj中定义
- Impala实践之十四:一次Impala节点故障记录(不能启动)
- tomcat源码解析(七):server和service
- JPA学习1-5
- android断点续传下载文件
- POJ 2955 Brackets (区间DP)
- 使用phonegap检测网络状态
- 简单爬虫的实现与学习笔记(完)(8/31)
- leetcode 225. Implement Stack using Queues
- Tomcat的 虚拟目录&虚拟主机 配置放方法
- BL1和BL2
- MySQL5.6 GTID模式 同步复制跳过报错解决方法
- gradle入门--11.疏忽lint毛病这特别重要 不加发布会出各种问题
- 毕业生自传(重生)