题意:问一个仅包含[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。
题解:dp[i][j]表示i~j内最大匹配字符个数,如果s[i]与s[j]匹配则dp[i][j]=dp[i+1][j-1]+2; dp[i][j]=max(dp[i][k]+dp[k+1][j]) i<k<j
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
//void io() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); }
string s;
int dp[110][110];
int main() {
while(cin>>s) {
if(s=="end") break;
memset(dp,0,sizeof dp);
for(int i=1;i<s.size();i++){
for(int j=0,k=i;k<s.size();j++,k++){
if((s[j]=='('&&s[k]==')')||(s[j]=='['&&s[k]==']'))
dp[j][k]=dp[j+1][k-1]+2;
for(int i1=j;i1<k;i1++)
dp[j][k]=max(dp[j][k],dp[j][i1]+dp[i1+1][k]);
}
}
cout<<dp[0][(int)(s.size()-1)]<<endl;
}
return 0;
}