#include <bits/stdc++.h> #include <climits> using namespace std; const int N = 101; string str; int dp[N][N]; bool check(char a,char b){ return (a=='('&&b==')') || (a=='['&&b==']'); } int main(){ cin>>str; int n = str.size(); str = ' ' + str; for(int i = 1;i<=n;i++) dp[i][i] = 1; for(int i = 1;i<n;i++){ for(int j = 1;j+i<=n;j++){ int k = j + i; dp[j][k] = INT_MAX; if(check(str[j],str[k])) { dp[j][k] = min(dp[j][k],dp[j+1][k-1]); } for(int k2 = j;k2<k;k2++){ dp[j][k] = min(dp[j][k],dp[j][k2]+dp[k2+1][k]); } } } cout<<dp[1][n]; return 0; }
只有一个的时候需要多加一个才能匹配,如果str[j]==str[k],那么dp[j][k] = min(dp[j][k],dp[j+1][k-1]),否则 dp[j][k] = min(dp[j][k],dp[j][k2]+dp[k2+1][k]);
#牛客春招刷题训练营#https://www.nowcoder.com/discuss/727521113110073344