POJ2955Brackets——dp

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

1.考虑区间。

2.当前区间可为自己子区间的和(题意果然是和而非最大值)。

3.考虑当前区间的边界。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int d[105][105],len;
bool v[105][105];
char s[105];
void dfs(int i,int j)
{
    if(v[i][j])return;
    v[i][j]=1;
    if(i==j)return;
    if(i+1==j)
    {
        if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
            d[i][j]=2;
        return;
    }
    for(int k=i;k<j;k++)
    {
        dfs(i,k);dfs(k+1,j);
        d[i][j]=max(d[i][j],d[i][k]+d[k+1][j]);
    }
    if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
    {
        dfs(i+1,j-1);
        d[i][j]=max(d[i][j],d[i+1][j-1]+2);
    }
}
int main()
{
    while(1)
    {
        gets(s);
        if(s[0]=='e')return 0;
        len=strlen(s);
        dfs(0,len-1);
        printf("%d\n",d[0][len-1]);
        memset(v,0,sizeof v);
        memset(d,0,sizeof d);
    }
}

 

posted on 2018-02-12 13:17  Narh  阅读(118)  评论(0编辑  收藏  举报

导航