算法实验题 4.5 括号问题
★问题描述
已知一个由 n 对括号组成的长度为 2n 的括号序列(任何一个左括号都从内到外与右边
距离最近的一个右括号相匹配),现在假设该序列被打乱了。阿菜只记得序列中所有左括号
的相对顺序和每一对括号中左括号和右括号的距离范围为[Li, Ri](1<=Li<=Ri<2n),请你
帮他恢复出原来正确的括号序列。
★编程任务
请你用程序恢复出原来正确的括号序列。
★数据输入
第 1 行输入整数 n(1<=n<=600),表示在正确的括号序列中有 n 个左括号。
接下来输入 n 行数,每行两个数 Li 和 Ri(1<=Li<=Ri<2n),分别描述第 i 个左括号和
与其匹配的右括号的距离范围的左边界和右边界(即第 i 个左括号与对应的右括号的距离最
近为左边界,最远为右边界)。输入每一行的描述的顺序和正确序列中左括号出现的顺序一
致(从左到右)。
★数据输出
如果可以恢复出原来的括号序列,请输出该序列。(如果存在多种可行方案,则输出第
一个右括号更靠前的方案,若两种方案第一个右括号位置相同,则输出第二个右括号位置靠
前的。若相同则依次类推,最终选出最优的方案)
如果无法恢复,请输出 IMPOSSIBLE。
输入文件示例 输出文件示例
4
1 1
1 1
1 1
1 1
()()()()
输入文件示例 输出文件示例
3
5 5
3 3
2 2
IMPOSSIBLE
输入文件示例 输出文件示例
3
2 3
1 4
1 4
(())()
题解:我们定义一个完整的连续序列 i,i+1,....,j-1,j (这里的i,j指的是括号编号)如果是一个完整连续序列,那么必须满足1、他们是连续的括号对,他们的左右括号放在连续的 (j-i+1)2个位置上,并且这连续的(j-i+1) 2个位置括号表达式是合法的,那么我们就说i,..,j可以组成一个完整的连续序列,我们会发现,最后答案就是要一个完整的连续序列。dp[i][j] = k 当k为-1的时候 i...j不能组成一个完整的连续序列,k不等于-1的时候i...j能组成一个完整的连续序列,我们有两种转移方式,
第一种:如果i,,,k,和k+1...j完整的连续序列,那么i...k,k+1,..j为完整的连续序列 dp[i][j] = dp[i][k] && dp[k+1][j]
第二种:如果i+1,j为完整的连续序列,并且编号为i的括号的右括号位置 可以允许放在编号为j的括号的右括号的右边一个,那么 dp[i][j] = dp[i+1][j]
有了这两种转移方法,答案要是一个最优的括号序列,那么我们的dp[i][j] = k k!=j 表示的是 i...j的连续完整序列是由i...k k+1...j 两个序列连接而成的, 如果k==j 就表示 第i对括号在 i+1...j 外面套了一层括号,他要求左括号最靠前的所以我们已找到就break掉,第二种转移是最坏的打算。
代码:代码