题意:给一个由()[]四种字符任意排列组成的字符串,求最长合法的不连续字串的长度。
思路:DP的时候有点倍增的意思,算出来以每个位置开始任意长度内的答案。倍增着算,注意计算一段的时候先判断两头是否可以匹配,然后再枚举分界点来继续松弛。关键给的字符串不超过100,数据太弱了(n^3)的复杂度。
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
char s[104];
int num[104][104];
int len;
bool OK(char a,char b)
{
if((a=='('&&b==')')||(a=='['&&b==']'))
return true;
return false;
}
int main()
{
while(scanf("%s",s)==1)
{
if(s[0]=='e')
break;
len=strlen(s);
memset(num,0,sizeof num);
for(int i=2;i<=len;i++)
{
for(int j=0;j<=len-i;j++)
{
if(OK(s[j],s[j+i-1]))
num[j][i]=max(num[j][i],2+num[j+1][i-2]);
for(intk=1;k<i;k++)
{
num[j][i]=max(num[j][i],num[j][k]+num[j+k][i-k]);
}
}
}
cout<<num[0][len]<<'\n';
}
return 0;
}