POJ-2955(区间DP)
括号匹配,区间DP入门题
题意:
输入一个字符串,只包括 [ ] ( )这四种字符,求合法最长合法括号子序列的长度。注意( [ ) ] 是不合法的。
题解:
考虑区间dp常规做法,枚举区间长度,枚举区间起点,枚举区间分割点。
dp[i][j]字符串从i到j的最长合法子序列的长度。
if ( s[i]和s[j] 匹配) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][]j) (k=i...j-1)
代码:
#include <iostream> #include<string> #include<cstring> #include<time.h> #include<cstdlib> #include<algorithm> using namespace std; const int N = 105; int dp[N][N]; int gao(string s) { int len = s.size(); memset(dp, 0, sizeof(dp)); for (int i = 1; i<=len; i++) { if (i == len - 1) { i = len - 1; } for (int j = 0; j + i - 1<len; j++) { int end = i + j-1; if (i>1) if (s[end] - s[j] == 1 || s[end] - s[j] == 2) dp[j][end] = max(dp[j][end], dp[j+1][end - 1] + 2); for (int k = j; k<end; k++) { dp[j][end] = max(dp[j][end], dp[j][k] + dp[k + 1][end]); } } } return dp[0][len - 1]; } int main() { string s; while (cin >> s) { if (s[0] == 'e')break; else cout << gao(s) << endl; } }
不疯魔不成活