题目大意:给出一系列的由’(‘和’)’ 组成的字符串,现有一种操作,可以将括号的方向变反,但需要花费1
现在问,需要花费多少的代价才能使该字符串的任意一个连续子串都不存在”()”的配对
解题思路:用dp[i][0]表示第i个位置变成’(‘的代价,dp[i][1]表示第i个位置变成’)’的代价
如果当前字符是’(‘的话,
dp[i][0] = min(dp[i - 1][1], dp[i - 1][0])
dp[i][1] = dp[i - 1][1] + 1
如果当前字符是’)’的话
dp[i][1] = dp[i - 1][1]
dp[i][0] = min(dp[i - 1][1], dp[i - 1][0]) + 1
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
char str[N];
int dp[N][2];
int main() {
int test;
scanf("%d", &test);
while (test--) {
scanf("%s", str + 1);
int len = strlen(str + 1);
memset(dp, 0, sizeof(dp));
if (str[1] == '(') {
dp[1][0] = 0;
dp[1][1] = 1;
}
else {
dp[1][0] = 1;
dp[1][1] = 0;
}
for (int i = 2; i <= len; i++) {
if (str[i] == '(') {
dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = dp[i - 1][1] + 1;
}
else {
dp[i][1] = dp[i - 1][1];
dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + 1;
}
}
printf("%d\n", min(dp[len][0], dp[len][1]));
}
return 0;
}