题解:对于字符串[A],只需要考虑最外层的2个字符是否配对,如果配对了,dp[i][j]=dp[i+1][j-1],
否则的话,例如[[),说明外层左右2个字符其中有1个是目前不能配对上的,需要再外层加字符配对,这时 dp[i][j] = min(1+dp[i+1][j], 1+dp[i][j-1])
另外需要考虑AB(A为配对字符串,B也是)的情况,这种情况就找断点即可,参考https://blog.csdn.net/deerly_/article/details/80342595
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char str[200];
int dp[200][200];
int main() {
scanf("%s", str);
int n = strlen(str);
for(int i = 0;i < n;i++) dp[i][i] = 1;
for(int len = 2;len <= n;len++)
for(int i = 0;i < n;i++) {
int j = i+len-1;
if(j>=n) break;
if(str[i]=='('&&str[j]==')') {
dp[i][j] = dp[i+1][j-1];
}
else if(str[i]=='['&&str[j]==']') {
dp[i][j] = dp[i+1][j-1];
}
else {
dp[i][j] = min(1+dp[i+1][j], 1+dp[i][j-1]);
}
for(int k = i;k < j;k++) {
if(dp[i][j] >= dp[i][k]+dp[k+1][j]) {
dp[i][j] = dp[i][k]+dp[k+1][j];
}
}
}
printf("%d\n" , dp[0][n-1]);
// scanf("%d", &n);
return 0;
}