POJ2955:Brackets(区间DP)

Brackets

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int check(char a, char b) {
    if(a == '(' && b == ')')
        return 1;
    if(a == '[' && b == ']')
        return 1;

    return 0;
}

int main() {
    //freopen("data.in", "r", stdin);
    char str[105];
    int dp[105][105], i, j, l, k, len;
    while(~scanf("%s", str)) {
        if(!strcmp(str, "end"))
            break;

        memset(dp, 0, sizeof(dp));
        len = strlen(str);
        //处理长度为1 2的区间
        for(int i = 0; i < len - 1; i++)
            dp[i][i] = 0;

        for(i = 0; i < len - 1; i++) {
            if(check(str[i], str[i+1]))
                dp[i][i+1] = 2;
            else
                dp[i][i+1] = 0;
        }

        for(l = 3; l <= len; l++) {
            for(i = 0; i+l-1 < len; i++) {
                int j = i+l-1;
                dp[i][j] = dp[i+1][j-1];

                if(check(str[i], str[j]))
                    dp[i][j] = dp[i+1][j-1] + 2;

                for(k = i; k < j; k++)//k从i枚举,这样才能从长度1来切分
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j]);
            }
        }
        printf("%d\n",dp[0][len-1]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/80989602