POJ - 2955 Brackets(区间dp)

来源:互联网 发布:视频矩阵和解码器 编辑:程序博客网 时间:2024/04/30 05:19

题目大意:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度

解题思路:区间dp,用dp[i][j]表示[i,j]这个区间内有符合规则的最长子串的长度
如果str[i] 和str[j]能构成 ()或者[],那么dp[i][j] = dp[i + 1][j - 1] + 2
剩下的情况就是
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j])

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;char str[N];int dp[N][N];void solve() {    int len = strlen(str);    memset(dp, 0, sizeof(dp));    for (int i = 1; i < len; i++)        for (int j = 0; j + i < len; j++) {            int k = j + i;            if ( (str[j] == '(' && str[k] == ')') || (str[j] == '[' && str[k] == ']')) dp[j][k] = dp[j + 1][k - 1] + 2;            for (int l = j; l < k; l++)                 dp[j][k] = max(dp[j][l] + dp[l  + 1][k], dp[j][k]);        }    printf("%d\n", dp[0][len - 1]);}int main() {    while (scanf("%s", str)) {        if (strcmp(str, "end") == 0) break;        solve();    }    return 0;}
0 0
原创粉丝点击