import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] S = s.toCharArray();
int[][] dp = new int[S.length][S.length];
for(int i = 0;i<S.length;i++){
//dp[i][j]表示子串S[i~j]至少需要添加几个括号
dp[i][i] = 1;//表示单个字符补全只需1个字符
}
for(int i = S.length-2;i>=0;i--){//从倒数第二个字符开始
for(int j = i+1;j<S.length;j++){
dp[i][j] = S.length;
if(match(S[i],S[j])){//如果两个字符本身就匹配,就转移到dp(S'),看子串S'需要几个括号
dp[i][j] = Math.min(dp[i][j],dp[i+1][j-1]);
}
/*
必须进行的步骤:若子串S至少有两个字符,
可转移到dp(A)+dp(B),若不进行,例如:[][],
它经过第一个转移方程后会转移到][,
若不经过第二个转移方程,就会错误的算出它要添加两个括号,
这显然是不合理的
*/
for(int k = i;k<j;k++){
dp[i][j] = Math.min(dp[i][j],dp[i][k] + dp[k+1][j]);
}
}
}
//输出
System.out.println(dp[0][S.length-1]);
}
//判断括号匹配
public static boolean match(char a,char b){
if(a == '(' && b == ')') return true;
if(a == '[' && b == ']') return true;
else{
return false;
}
}
}
括号序列——动态规划(Java)
于 2022-02-21 08:58:58 首次发布