题目描述
Hecy 又接了个新任务:BE 处理。
BE 中有一类被称为 GBE。
以下是 GBE 的定义:
空表达式是 GBE
如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
如果 A 与 B 都是 GBE,那么 AB 是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。
注意:BE 是一个仅由(、)、[、]四种字符中的若干种构成的字符串。
输入格式
输入仅一行,为字符串 BE。
输出格式
输出仅一个整数,表示增加的最少字符数。
数据范围
对于所有输入字符串,其长度小于100。
输入样例:
[])
输出样例:
1
思路
这题与密码脱落的思路类似,我还是从集合的最大值分析,而不是跟y总一样分析最小值。
import java.io.*;
import java.math.BigDecimal;
import java.time.Year;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in = new StreamTokenizer(br);
static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
public static int nextInt() throws Exception {
in.nextToken();
return (int) in.nval;
}
public static boolean check(char a ,char b) {
if(a=='['&&b==']') return true;
else if (a=='('&&b==')') {
return true;
}else {
return false;
}
}
static int N = 110;
static char[] s;
static int[][] dp = new int[N][N];
public static void main(String[] args) throws Exception {
s = nextLine().toCharArray();
int n = s.length;
//长度从2开始,这样不用处理边界L-1 越界问题,长度为1的话匹配括号数量只能为0
for (int len = 2; len <= n; len++) {
for (int l = 0; l <= n - len; l++) {
int r = l + len - 1;
dp[l][r] = Math.max(dp[l+1][r], dp[l][r-1]);
if(check(s[l], s[r])) {
dp[l][r] = Math.max(dp[l][r], dp[l+1][r-1]+2);
}
for(int k = l;k<=r-1;k++) {
dp[l][r] = Math.max(dp[l][k]+dp[k+1][r], dp[l][r]);
}
}
}
System.out.println(n-dp[0][n-1]);
}
}