动态规划

94 阅读3分钟

动态规划 三、括号序列 【问题描述】

    给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加 完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果。

    两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括号。

    例如,对于括号序列 (((),只需要添加两个括号就能让其合法,有以下几种不同的添加结果:()()() 、()(()) 、(())()、(()()) 和 ((()))。

【输入格式】

    输入一行包含一个字符串s,表示给定的括号序列,序列中只有左括号和右括号。

【输出格式】

    输出一个整数表示答案,答案可能很大,请输出答案除以1000000007(即109+7) 的余数。

【样例输入】

    ((()

【样例输出】

    5

【评测用例规模与规定】

    对于40%的评测用例,|s|⩽200。

    对于所有评测用例,1⩽|s|⩽5000。

解析: 在开始解题之前,我们先分析两个问题。

    问题1. 什么情况下必须要添加左括号,什么情况下必须添加右括号?

    问题2. 我们添加的左括号会和我们添加的右括号匹配吗?

    对于问题1,我们可从以下两方面作进一步思考:

    (1)当一个右括号之前已经没有可以与其相匹配的左括号时,我们必须要添加左括号。例如() ),从左往右看,第二个右括号之前已经没有左括号可以与其匹配(第一个左括号和第一个右括号匹配),这时候我们就必须添加左括号。

    (2)当一个左括号之后已经没有可以与其相匹配的右括号时,我们必须要添加右括号。例 如(( ),从右往左看,第二个左括号之后已经没有右括号可以与其匹配(第一个右括号和第 一个左括号匹配),这时候我们就必须添加右括号。

    对于问题2,答案是“不会”。

    我们可以使用反证法来证明:

    (1)假设操作完成后的括号序列为 XXX ( XXX ) XXX ,(、) 为我们添加的互相匹配 的左括号和右括号,X 表示原序列的括号,或是我们添加的与原序列括号相匹配的 括号。

    (2)那么该序列 XXX(XXX)XXX 若是一个合法序列,则将 (、) 去掉后的序列 XXX XXX XXX也会是个合法序列(对于一个合法的括号序列,去掉任意一对匹配的左右括号,它也依旧合法)。

    (3)所以如果我们添加的左右括号相互匹配,它们将起不到什么作用,只会徒然增长序 列的长度。而题目要求我们的序列长度尽可能短,所以我们添加的左括号不会和我 们添加的右括号匹配( 即我们添加的左括号只会受原序列中的括号影响,添加的右括号只会受原序列中的括号影响)。