哎,久疏战阵啊,决定以后还是多打打BC吧~毕竟算法不能丢下~
题意:给一个括号序列“如((()))()”,最小的修改是它任意的子序列都不匹配(非法)。
O(N)算法:最终状态必然是“))).....(((”这样子的,所以用俩个数组,分别从左右两边扫,记录到当前位置代价。球最小代价即可。
哎。。。
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
int r[1001];
int l[1001];
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
int len=s.size();
for(int i=0;i<len+1;i++)
r[i]=l[i]=0;
for(int i=0;i<len;i++)
{
if(i==0)l[i]=(s[i]=='(');
else l[i]=l[i-1]+(s[i]=='(');
}
for(int i=len-1;i>=0;i--)
{
if(i==len-1)r[i]=(s[i]==')');
else r[i]=r[i+1]+(s[i]==')');
}
int mins=100000;
for(int i=0;i<len;i++)
if(r[i]+l[i]-1<mins)
mins=r[i]+l[i]-1;
cout<<mins<<endl;
}
return 0;
}