poj 2955 Brackets(区间dp)

题目链接:http://poj.org/problem?id=2955

题意:求相互匹配的括号个数。

一道简单的区间dp,按常规的套路来写就可以了。

#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int dp[110][110];
int main() {
    string s;
    while(cin >> s) {
        if(s[0] == 'e')
            break;
        int len = s.size();
        memset(dp , 0 , sizeof(dp));
        for(int i = 0 ; i < len - 1 ; i++) {
            if((s[i] == '(' && s[i + 1] == ')') || (s[i] == '[' && s[i + 1] == ']')) {
                dp[i][i + 1] = 2;
            }
        }
        for(int i = 2 ; i < len ; i++) {
            for(int j = 0 ; j < len && j + i < len ; j++) {
                int MAX1 = dp[j + 1][j + i - 1] , MAX2 = dp[j][j + i];
                for(int k = j + 1 ; k < i + j - 1 ; k++) {
                    MAX1 = max(MAX1 , dp[j + 1][k] + dp[k + 1][i + j - 1]);
                }
                if((s[j] == '(' && s[i + j] == ')') || (s[j] == '[' && s[i + j] == ']')) {
                    MAX1 += 2;
                }
                for(int k = j ; k < i + j ; k++) {
                    MAX2 = max(MAX2 , dp[j][k] + dp[k + 1][i + j]);
                }
                dp[j][j + i] = max(MAX1 , MAX2);
            }
        }
        cout << dp[0][len - 1] << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6179384.html