POJ2955Brackets——dp

时间:2021-12-23 16:24:52

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

1.考虑区间。

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

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

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