题目:
给出一串字符 问括号的最大匹配数
思路:
初始化为0
从1开始枚举长度 每段长度答案判断之一段的两端是不是一对括号 是的话 dp[i][j] = dp[i + 1][j - 1] + 2
判断完成后dp[i][j]永远取max
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
char s[105];
int dp[105][105];
bool check(int a,int b){
if(s[a] == '(' && s[b] == ')') return 1;
if(s[a] == '[' && s[b] == ']') return 1;
return 0;
}
int main()
{
while(~scanf("%s",s + 1)){
if(s[1] == 'e') break;
int n = strlen(s + 1);
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n; j++){
dp[i][j] = 0;
}
}
for(int i = 1;i <= n; i++){//枚举长度
for(int j = 1;j + i - 1 <= n; j++){//枚举开头
int L = j + i - 1;
if(check(j,L)){
dp[j][L] = dp[j + 1][L - 1] + 2;
}
for(int k = j;k < L; k++){
dp[j][L] = max(dp[j][L],dp[j][k] + dp[k + 1][L]);
}
}
}
printf("%d\n",dp[1][n]);
}
}