algorithm - Google codejam APAC 测试练习轮 : Parentheses Order

标签 algorithm dynamic-programming

我花了一天时间解决 this problem并且无法找到传递大型数据集的解决方案。

问题

n个括号序列由n个"("s和n个")"组成。

现在,我们有了所有有效的 n 个括号序列。按字典顺序查找第 k 个最小的序列。

例如,这里是所有有效的 3 个括号序列,按字典序排列:

((()))

(()())

(())()

()(())

()()()

给定 n 和 k,编写一个算法以按字典顺序给出第 k 个最小的序列。

对于大数据集:1 ≤ n ≤ 1001 ≤ k ≤ 10^18

最佳答案

这个问题可以用动态规划来解决

  • dp[n][m] = 如果我们有 n,可以创建的有效括号数打开括号和 m关闭括号。
  • 基本案例:
    dp[0][a] = 1 (a >=0)
  • 使用基本情况填充矩阵:
    dp[n][m] = dp[n - 1][m] + (n < m ? dp[n][m - 1]:0 );

然后,我们可以慢慢构建第 k 个括号。

  • a = n 个左括号b = n 个右括号开头,当前结果为空

    while(k is not 0):
         If number dp[a][b] >= k: 
                If (dp[a - 1][b] >= k) is true:
                   * Append an open bracket '(' to the current result
                   * Decrease a 
                Else:
                   //k is the number of previous smaller lexicographical parentheses
                   * Adjust value of k: `k -= dp[a -1][b]`,
                   * Append a close bracket ')' 
                   * Decrease b
         Else k is invalid
    

    请注意,按字典顺序,左括号小于右括号,因此我们总是尝试先添加左括号。

关于algorithm - Google codejam APAC 测试练习轮 : Parentheses Order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971299/

相关文章:

python - 有关动态规划的更多信息

algorithm - 采访 : Renaming all files in a directory using a data structure

c++ - 图 - 邻接表 C++ - 从源到目的地的所有路径

algorithm - 线性规划算法

python - Needleman-Wunsch 算法动态规划实现中的回溯

c - 这个买卖股票的递归DP算法的算法和底层结构是什么?

java - 我怎样才能在 Java 中做一个 "return back"按钮?

java - 曼哈顿距离澄清

algorithm - 归约算法 - 将任何 SGI 问题重铸为子集和

swift - 使用字符串快速调用动态方法