2021蓝桥杯省赛J:括号序列-思维+动态规划

2023大厂真题提交网址(含题解):

www.CodeFun2000.com(http://101.43.147.120/)

最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练习,体会真题难度。现在OJ已录入50+道2023年最新大厂真题,同时在不断的更新。同时,可以关注"塔子哥学算法"公众号获得每道题的题解。
在这里插入图片描述
题目链接

题目大意:

给你一个括号序。让你添加最少的括号使得它合法,输出多少种本质不同的结果.

例如:(() -> ()() , (())

n ≤ 5 e 3 n \leq 5e3 n5e3

题目思路(from y总):

有几个性质需要发现:
1.最开始我们可以知道要加多少个左括号,要加多少个右括号.

2.左括号和右括号的插入是独立的,可以直接方案相乘起来.
解释:如果左右括号不位于同一个间隙,显然方案相乘.而就算有若干个左右括号在同一个间隙中,也一定是 ) ) . . ) ) ( ( . . ( ( ))..))((..(( ))..))((..((这样排布的,所以方案是唯一的。

3.插入左括号和插入右括号本质相同,将序列翻转后,每个字符也翻转即可。

所以接下来就解决:给定一个括号序列,如何求有多少种最少的放左括号的方案数.

既然要求方案数,那么我们需要知道:两种方案不同的条件。

既然我们只加左括号,那么右括号是不会变的。所以不妨将右括号看作隔板。
那么任意一个括号序列被分解成若干个左括号+1/0个右括号的段

例如:
()(()(( 就被分成: [()][(()][((]这三个段。

那么这样一来,其实任一个括号序列都可以被表示成每一个段内左括号的个数:

例如上述例子就为: 1 2 2

那么我们的目标就是来枚举每一个段内放多少个左括号。然后我们也规定,括号只插入在右括号的前面,保证没有重复(因为一个段内,左括号插在哪不影响,本质一样,所以就直接规定插在右括号的前面).

然后根据括号序列的顺序,我们有以下状态: d p ( i , j ) dp(i,j) dp(i,j)为前i个括号,左比右多j个的方案数.

转移为:
当 a [ i ] = ′ ( ′ ,    d p ( i , j ) = d p ( i − 1 , j − 1 ) 当a[i]='(' ,\ \ dp(i,j)=dp(i-1,j-1) a[i]=(,  dp(i,j)=dp

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值