3 () (((( (())
1 0 2
/************************************************************************/
附上该题对应的中文题
给定一个由'('和')'组成的字符串,一次修改可以翻转字符串中的一个字符,将'('变成')'或者将')'变成'('。
如果要让这个字符串中任意一个非空子串都不是括号匹配串,至少要修改多少次?
比如"()","(())","()()" 是括号匹配串, 但"((", ")(", "((()" 不是。
输入文件包含多组数据,第一行为数据组数T。 每一组数据为一个字符串S,S只由'('和')'构成。 1≤∣S∣≤1,000.
对每组数据输出至少需要修改的字符数。
3 () (((( (())
1 0 2
出题人的解题思路:
题目要求每一个子串都不是括号匹配串,实际上只要使得括号匹配的单元“()”串不是该串的子串即可。所以最终串肯定是连续数个')'以及连续数个'(',统计出其中代价最小的即可。
其实在做这个题的时候,还轻松加愉快地以为只要记录'('出现的个数以及')'的个数,输出小的那个即为所求#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<map> #include<set> #include<stdlib.h> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 1005; const int inf = 1000000000; const int mod = 2009; char s[N]; int main() { int t,i,j,c,Min,l; scanf("%d",&t); while(t--) { Min=inf; scanf("%s",s); l=strlen(s); for(i=0;i<=l;i++) { for(c=j=0;j<i;j++) if(s[j]!=')') c++; for(;j<l;j++) if(s[j]!='(') c++; Min=min(Min,c); } printf("%d\n",Min); } return 0; }菜鸟成长记