题意:括号匹配,两个括号能匹配上,和就加二。
一道区间dp题,刚刚入门,说一下区间dp的思路,就是:不断遍历整个区间,第一次遍历求出子区间长度为1的区间的最大值,第二次遍历求出子区间长度为2的区间的最大值,以此类推,直到求出区间长度为整个区间的最大值。
代码如下:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[105][105];
char a[105];
int main()
{
int length;
while(cin>>a)
{
if(a[0]=='e')
break;
length=strlen(a);
memset(dp,0,sizeof(dp));
for(int i=1;i<length;i++) //i表示区间长度,接下来是求所有该长度下的最大值
{
for(int j=0;j+i<length;j++) //j表示起点,j加上区间长度i就是该段终点
{
if((a[j]=='('&&a[j+i]==')')||(a[j]=='['&&a[j+i]==']')) //起点与终点能匹配
dp[j][j+i]=dp[j+1][j+i-1]+2;
for(int k=j;k<j+i;k++) //如果不让起点与终点匹配,而是令这一大段分成两段,判断这样求和会不会比起点与终点匹配求和更大
dp[j][j+i]=max(dp[j][j+i],dp[j][k]+dp[k+1][j+i]); //注意k的取值[j,j+i),需要自己体会。
}
}
cout<<dp[0][length-1]<<endl;
}
return 0;
}