poj 2955(Brackets)【 区间dp2】

来源:互联网 发布:征途重置版网络不稳定 编辑:程序博客网 时间:2024/06/13 05:09

由于最近练习所以将区间DP的专题拿出来作,感谢博主的推荐:

专题地址:点击打开链接

题目链接:点击打开链接

题目大意:求配对的括号的最大数目

题目分析:和之前的几题一样先进行预处理,最重要的是枚举长度,在移动分界点从而进行dp

                  dp[i][i+k]=max(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);


代码如下,欢迎斧正

#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<cmath>using namespace std;char s[110];int dp[110][110];bool f[110][110];int len;bool match(int a,int b){    if(s[a]=='('&& s[b]==')')  return true;    if (s[a]=='['&&s[b]==']') return true;    return false;}void solve(){    len=strlen(s);    int i,j,k;    for(i=0;i<len;i++)    {        if(match(i,i+1))        {   dp[i][i+1]=2;            if(match(i+2,i+3))               dp[i][i+3]=4;        }        if((match(i+1,i+2))&&(match(i,i+3)))        {            dp[i][i+3]=4;        }    }    for (k=2;k<len;k++)    {        for(i=0;i+k<len;i++)        {            if(match(i,i+k))              dp[i][i+k]=dp[i+1][i+k-1]+2;            for(j=i;j<i+k;j++)               dp[i][i+k]=max(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);        }    }}int main(){    while(1)    {        scanf("%s",s);        if(s[0]=='e')   break;        memset(f,false,sizeof(f));        memset(dp,0,sizeof(dp));        solve();        printf("%d\n",dp[0][len-1]);    }    return 0;}


原创粉丝点击