Language:
Brackets
Description We give the following inductive definition of 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 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 一道很古典的区间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,布布扣,bubuko.com
原文:http://blog.csdn.net/mowayao/article/details/24103083