zoukankan      html  css  js  c++  java
  • 括号问题

    算法实验题 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掉,第二种转移是最坏的打算。

    代码:代码

  • 相关阅读:
    SoapUI 使用笔记
    git 使用笔记(二)
    git 使用笔记(一)
    jquery 拓展
    hdu 1024 Max Sum Plus Plus (DP)
    hdu 2602 Bone Collector (01背包)
    hdu 1688 Sightseeing (最短路径)
    hdu 3191 How Many Paths Are There (次短路径数)
    hdu 2722 Here We Go(relians) Again (最短路径)
    hdu 1596 find the safest road (最短路径)
  • 原文地址:https://www.cnblogs.com/Opaser/p/6131813.html
Copyright © 2011-2022 走看看