|
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