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

POJ2955【区间DP】

时间:2017-02-14 11:32:14      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:algorithm   字符   bre   char   scan   pre   意思   turn   space   

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

题意:[]、()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。

思路:区间DP,dp[l][r]的意思是区间[l,r]的最大匹配数,预处理长度为2的所有区间的最大匹配数,然后由长度为2的区间推出长度为3的所有区间的最大匹配数,由长度为3的区间......在处理区间[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;
const int MAXN = 150;
int dp[MAXN][MAXN];
char s[MAXN];
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;
}

 

POJ2955【区间DP】

标签:algorithm   字符   bre   char   scan   pre   意思   turn   space   

原文地址:http://www.cnblogs.com/pealicx/p/6396557.html

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