CFG算法的本地搜索

时间:2015-05-16 16:01:44

标签: algorithm optimization context-free-grammar

是否存在可在多项式时间内解决以下问题的算法:

我们正在连接bitset中的位:

  • 0只能连接到1
  • 每个位只能连接一次
  • 连接不能相交

给定位集的最大连接数是多少?

2 个答案:

答案 0 :(得分:4)

我们可以在这里使用动态编程。

  1. 状态为(l, r) - 给定字符串的[l, r]子字符串。

  2. 状态的值是子字符串中匹配符号的最大数量。

  3. 基本情况很简单:对于所有小于2的子串,答案为0。

  4. 对于所有较长的子串,我们可以做两件事:

    • 不要将第一个符号与任何内容匹配。

    • 将其与某些内容匹配并独立解决两个较小的子问题(它们是独立的,因为不允许交叉)。

  5. 那就是它。时间复杂度为O(n^3)(每个都有O(n^2)个状态和O(n)转换。这是一个伪代码(为简洁起见,省略了memoization):

    def calc(l, r)
        if l >= r
            return 0
        res = calc(l + 1, r)
        for k = l + 1 to r
            if match(s[l], s[k]) // match checks that two characters match
                res = max(res, 1 + calc(l + 1, k - 1) + calc(k + 1, r)) 
        return res 
    

答案 1 :(得分:0)

实际上,给定序列0s和1s中的最大连接数是这两个值中的最小值 - 序列中的0的数量和序列中的1的数量。

如果您无法连接少数的所有位,则不存在这种情况。所以这个问题可以在O(n)中解决。