POJ 2955-Brackets
2014-04-19 12:41
411 查看
Language: Default Brackets
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 一道很古典的区间DP。。。。水过。。。 dp[ sta] [ed] = { if(两端匹配 ) min(dp[sta+1][ed-1]+2,dp[sta][k]+dp[k+1][ed]) (sta<=k<ed) else min(dp[sta][k]+dp[k+1][ed]) (sta<=k<ed) } #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <map> using namespace std; const int maxn = 100+10; string st; int n; int dp[maxn][maxn]; map<char,char> mma; int dfs(int sta,int ed){ if(sta>=ed) return 0; if(dp[sta][ed] != -1) return dp[sta][ed]; int ans = 0; if(mma[st[sta]]==st[ed] ) ans = dfs(sta+1,ed-1)+2; for(int i = sta; i < ed; i++){ ans = max(ans,dfs(sta,i)+dfs(i+1,ed)); } return dp[sta][ed] = ans; } int main(){ mma['('] = ')'; mma['['] = ']'; while(cin >> st && st != "end"){ memset(dp,-1,sizeof dp); n = st.size(); cout<<dfs(0,n-1)<<endl; } return 0; } |
相关文章推荐
- POJ 2955 Brackets 区间dp
- POJ 2955 Brackets(区间DP)
- poj 2955 Brackets(区间DP求最长匹配子串)
- POJ 2955 Brackets (DP Or 记忆化搜索 总结)
- Poj 2955 brackets(区间dp)
- poj 2955 Brackets(区间DP)
- POJ 2955-Brackets(区间DP)
- POJ 2955-Brackets
- poj2955 Brackets
- Brackets POJ - 2955 区间dp
- POJ 2955 Brackets
- POJ 2955- Brackets[区间dp]
- poj 2955 Brackets 括号匹配 区间dp
- POJ 2955 Brackets
- POJ2955 Brackets(区间DP,括号匹配)
- POJ 2955 Brackets & POJ 1505 Copying Books & POJ 1651 Multiplication Puzzle(初级区间DP)
- 【POJ 2955】Brackets
- poj 2955 Brackets (区间DP)
- poj 2955 Brackets(区间DP)
- POJ2955 Brackets (DP)