POJ 2955 Brackets (区间DP)

题目大意:

给你一个字符串,问其中匹配的括号有多少个?  
下面是用记忆化搜索写的。
 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL INF = 0xfffffff;
const LL maxn = 255;
char str[maxn];
int dp[maxn][maxn];
bool OK(int L,int R)
{
    if((str[L] == '[' && str[R] == ']') || (str[L] == '(' && str[R] == ')'))
        return 2;
    return 0;
}
int DFS(int L,int R)
{
    if(dp[L][R] != -1)
        return dp[L][R];
    if(L == R+1)
        return OK(L,R) ;
    if(L >= R)
        return 0;
    dp[L][R] = DFS(L+1, R);

    for(int i=L+1; i<=R; i++)
    {
        if( OK(L,i) )
            dp[L][R] = max(dp[L][R], DFS(L+1,i-1) + DFS(i+1,R) + 2);
    }
    return dp[L][R];
}

int main()
{
    while(cin >> str, strcmp(str, "end"))
    {
        memset(dp, -1, sizeof(dp));
        printf("%d\n",DFS(0, strlen(str)-1) );
    }
    return 0;
}

 

 
posted @ 2015-09-24 19:19  向前走丶不回首  阅读(102)  评论(0编辑  收藏  举报