码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2955 Brackets

时间:2018-05-04 10:31:34      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:memset   区间   can   int   namespace   std   amp   while   turn   

题意如下:

给一个只包含‘[’,‘]’,‘(’,‘)’的字符串求最大的匹配数,匹配是指一个左括号和一个它右边的右括号匹配,这样一对匹配数是2.

该题是一道区间DP题,思想如下:

在处理区间[ l , r ]的时候,如果s[ l ]与s[ r ]相匹配,那么dp[ l ][ r ]=dp[ l + 1 ][ r - 1 ]+2;

然后再取区间[ l , r ]的每个断点k,dp[ l ][ r ]=max(dp[ l ][ r ],dp[ l ][ k ]+dp[ k + 1 ][ r ])即找中间的最大数。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[150][150];
char s[150];
int main ()
{
    while(~scanf("%s", s + 1))
    {
        memset(dp, 0, sizeof(dp));
        if(s[1] == e) break;
        int len = strlen(s + 1);
        for(int l = 1; l <= len; l++)
            for(int i = 1; i <= len - l + 1; i++)
            {
                int j = i + l - 1;
                if((s[i] == ( && s[j] == )) || (s[i] == [ && s[j] == ]))
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                for(int k = i; k < j; k++)
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
            }
        printf("%d\n", dp[1][len]);
    }
    return 0;
}

 

POJ 2955 Brackets

标签:memset   区间   can   int   namespace   std   amp   while   turn   

原文地址:https://www.cnblogs.com/fantastic123/p/8988728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!