POJ 2955:Brackets(区间DP)
2017-08-04 20:04
423 查看
Brackets
Time limit:20000 ms Memory limit:65536 kBProblem 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
题意:
给出一个括号串,求最长的合法的子序列的长度。解题思路:
设dp[i][j]为最大长度,那么如果第i个和第j个配对,那么dp[i][j]=dp[i+1][j−1]+2再把所有的dp[i][i+k]+dp[i+k+1][j]都遍历一次,看有没有更大的情况,如果有就更新咯。Code:
#include <iostream> #include <cstring> #include <algorithm> #include <string> #include <cstdio> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn=105; int dp[maxn][maxn]; int main() { string str; while(cin>>str) { if(str=="end") break; int len=str.length(); mem(dp,0); for(int i=1;i<len;i++) { for(int j=0;j<len-i;j++) { if((str[j]=='('&&str[j+i]==')')||str[j]=='['&&str[j+i]==']') dp[j][j+i]=dp[j+1][j+i-1]+2; for(int k=0;k<i;k++) { dp[j][j+i]=max(dp[j][j+i],dp[j][j+k]+dp[j+k+1][j+i]); } } } cout<<dp[0][len-1]<<endl; } return 0; }
相关文章推荐
- POJ 2955 Brackets (区间DP)
- POJ 2955 Brackets 括号匹配 区间DP
- POJ 2955 Brackets (区间DP入门)
- poj 2955 Brackets 区间dp
- poj 2955 Brackets 区间dp
- POJ 2955 Brackets(区间DP, 记忆化搜索)
- Brackets POJ - 2955 区间dp
- POJ-2955 Brackets (区间DP)
- poj 2955 Brackets(区间dp)
- NYOJ 15 括号匹配(二) 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 】