2023大厂真题提交网址(含题解):
www.CodeFun2000.com(http://101.43.147.120/)
最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练习,体会真题难度。现在OJ已录入50+道2023年最新大厂真题,同时在不断的更新。同时,可以关注"塔子哥学算法"公众号获得每道题的题解。
题目链接
题目大意:
给你一个括号序。让你添加最少的括号使得它合法,输出多少种本质不同的结果.
例如:(() -> ()() , (())
n ≤ 5 e 3 n \leq 5e3 n≤5e3
题目思路(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