配对括号
题目
Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。
以下是 GBE 的定义:
1.空表达式是 GBE
2.如果表达式 GBE,则 GBE
3.如果 GBE,那么 GBE
给出一个 GBE。
解析
这道题可以用动态规划来解决
所以我们需要定义一下几个东西:废话
- 数组
a 存储输入的字符串 - 二维数组
f 存储动态规划过程中的状态转移结果 - 变量
n 存储字符串的长度
过程:好像什么都没说
首先读入字符串并计算其长度。然后初始化状态数组
函数
然后就是最重要的函数
它接受两个参数
状态转移方程:
对于区间
而当
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char a[110];
int f[110][110];
int n;
bool ch(char a,char b){//判断两个字符是否是匹配的括号
if(a=='('&&b==')') return 1;
if(a=='['&&b==']') return 1;
return 0;
}
void dp(int i,int j){
for(int k=i;k<=j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
//枚举子串中所有可能的分割点k,并根据状态转移方程更新
if(ch(a[i],a[j])) f[i][j]=min(f[i][j],f[i+1][j-1]);
//如果是,则根据状态转移方程更新状态数组f[i][j]的值
}
int main(){
scanf("%s",a+1);
n=strlen(a+1);//计算字符串a的长度
for(int i=1;i<=n;i++)
//初始化f数组的对角线元素为1,表示单个字符需要添加一个括号才能匹配
f[i][i]=1;
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++){//枚举所有可能的子串长度和起始位置
int j=i+len-1;
f[i][j]=0x7fffffff;//初始化为一个很大的数,表示最初没有找到合适的方案
dp(i,j);
}
printf("%d",f[1][n]);//完成撒花
return 0;
}