首页 > 其他 > 详细

POJ 2955 (区间DP)

时间:2014-10-25 17:12:05      阅读:190      评论:0      收藏:0      [点我收藏+]

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

题目大意:括号匹配。对称的括号匹配数量+2。问最大匹配数。

解题思路

看起来像个区间问题。

DP边界:无。区间间隔为0时,默认为memset为0即可。

对于dp[i][j],如果i和j匹配,不难有dp[i][j]=dp[i+1][j-1]+2.

然后枚举不属于两端的中点, dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]),合并两个区间的结果。

 

#include "cstdio"
#include "string"
#include "cstring"
#include "iostream"
using namespace std;
bool check(char a,int b)
{
    if(a==(&&b==)) return true;
    else if(a==[&&b==]) return true;
    else return false;
}
int dp[105][105];
int main()
{
    //freopen("in.txt","r",stdin);
    string str;
    while(cin>>str&&str!="end")
    {
        int n=str.size();
        for(int p=1;p<n;p++)
        {
            for(int i=0;i<n-p;i++)
            {
                int j=i+p;
                if(check(str[i],str[j])) dp[i][j]=dp[i+1][j-1]+2;
                for(int k=i+1;k<j;k++)
                    dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]);
            }
        }
        printf("%d\n",dp[0][n-1]);
        memset(dp,0,sizeof(dp));
    }
}

 

POJ 2955 (区间DP)

原文:http://www.cnblogs.com/neopenx/p/4050334.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!