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

    代码:代码

  • 相关阅读:
    微信输入文字和更多切换时不改变下面layout大小
    bitmap1 = bitmap2导致bitmap1不能使用一致报回收错误解决
    Mac下命令行打开Sublime
    android.content.res.Resources$NotFoundException:String resource ID #0x86
    SEGGER RTT STOP/SLEEP 模式下使用
    STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式
    NRF52832 能烧写代码 但是不运行 ,是因为没有烧写协议栈
    NRF52832 Logger module 设置
    jlink RTT 打印 BUG , FreeRTOS 在开启 tickless 模式下 无法使用的问题
    gattAttribute_t 含义 中文解释
  • 原文地址:https://www.cnblogs.com/Opaser/p/6131813.html
Copyright © 2011-2022 走看看