POJ 2955- Brackets[区间dp]
2017-11-30 18:20
330 查看
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
Input
The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters
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
Sample Output
思路: 对左括号不进行处理, rev数组存储一个括号的反括号 如rev['('] = ')' 其余的同理
dp[i][j] 代表的是i到j位置匹配的最大个数
转移方程dp[i][j] = dp[i][j-1], 对任意i,j
dp[i][j] = (dp[i][k] + dp[k+1][j] +1, a[k] = rev[a[j]]
answer = dp[0][N-1] *2
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
思路: 对左括号不进行处理, rev数组存储一个括号的反括号 如rev['('] = ')' 其余的同理
dp[i][j] 代表的是i到j位置匹配的最大个数
转移方程dp[i][j] = dp[i][j-1], 对任意i,j
dp[i][j] = (dp[i][k] + dp[k+1][j] +1, a[k] = rev[a[j]]
answer = dp[0][N-1] *2
#include<iostream> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<iomanip> #include<stdlib.h> #include<cstdio> #include<string> #include<string.h> #include<set> #include<stack> #include<map> using namespace std; #define rep(i, n) for(int i=0; i<n ;i++) #define rep1(i, n) for(int i=1; i<=n; i++) typedef long long ll; typedef pair<int,int> P; const int INF = 0x7fffffff; const int MAX_N = 105; const int MAX_V = 0; const int MAX_M = 0; const int MAX_Q = 1e5+5; int dp[MAX_N][MAX_N]; int l[3] = {'(','[','{'}, r[3] = {')',']','}'}; int rev[256]; int main(){ string a; for(int i=0; i<3; i++){ rev[l[i]] = r[i]; rev[r[i]] = l[i]; } while(getline(cin, a)){ if(a=="end") break; int N = a.length(); for(int i=0; i<N; i++){ dp[i][i] = 0; } for(int j=1; j<N; j++){ for(int i=0; i<j; i++){ dp[i][j] = dp[i][j-1]; bool flag = false; for(int s =0; s<3; s++) if(a[j]==r[s]) flag = true; if(flag){ for(int k=i; k<j; k++){ if(rev[a[k]]==a[j]){ dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j-1]+1); } } } } } cout<<dp[0][N-1]*2<<endl; } }
相关文章推荐
- poj 2955 Brackets(区间DP)
- 【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,常规)
- POJ 2955 Brackets 区间DP 最大括号匹配
- POJ 2955 Brackets 【区间dp】
- poj 2955 Brackets (区间DP)
- Brackets(POJ - 2955)区间dp