题目链接
题目大意:
就是给一个最大长度为100的字符串,求能陪成对的最多有多少个
之前做小比赛的时候做到了区间dp的题,就又找了几个做。
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=109;
char a[N];
int dp[N][N];
// dp[i][j]代表在i到j之间的最多配对的数目,如果在这期间,如果a[i]能与这期间的任一个配对,那么就先让它与其配对
int main()
{
// freopen("input.txt","r",stdin);
int len,i,j,k;
while(scanf("%s",a+1),strcmp(a+1,"end")!=0)
{
memset(dp,0,sizeof(dp));
len=strlen(a+1);
for(j=1;j<=len;j++) {//因为这里每次dp[i][j]都要用到dp[i+1][j]所以要先更新j的
for(i=1;i<=j;i++) {
int t=0;
for(k=i;k<=j;k++) {
if((a[i]=='(' && a[k]==')') || (a[i]=='[' && a[k]==']'))
t=max(t,dp[i+1][k-1]+1+dp[k+1][j]);
if((a[k]=='(' && a[j]==')')|| (a[k]=='[' && a[j]==']'))
t=max(t,dp[i][k-1]+1+dp[k+1][j-1]);
}
dp[i][j]=max(t,max(dp[i+1][j],dp[i][j-1]));
}
}
printf("%d\n",dp[1][len]*2);
}
return 0;
}