每日打卡(1/1)
传送门:点击打开链接
题目大意:
括号匹配,求最少要添加的括号数量;
思路:
用dp[i][j]来表示从i到j至少要用多少个括号。
情况1:dp[i][j] = dp[i+1][j],表示从i到j假如都不能匹配,那就加1个括号;
情况2:如果从i到j中存在一个数k,使得s[i]和s[k]匹配,那么最小的匹配数量就是dp[i+1][k-1]+dp[k+1][j] (第i个和第k个匹配掉了)。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int n,len,dp[maxn][maxn];
string s;
bool judge(int x,int y)
{
if((s[x]=='('&&s[y]==')')||(s[x]=='['&&s[y]==']'))
return true;
return false;
}
int main()
{
scanf("%d",&n);
while(n--)
{
memset(dp,0,sizeof(dp));
cin>>s;
len = s.length();
for(int i=0;i<len;i++)
dp[i][i] = 1;
for(int i=len-2;i>=0;i--)//必须先求出i之后行数的前j个
for(int j=i;j<len;j++)
{
dp[i][j] = dp[i+1][j]+1;
for(int k=i+1;k<=j;k++)
{
if(judge(i,k))
dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k+1][j]);
}
}
cout<<dp[0][len-1]<<endl;
}
return 0;
}