是否存在可在多项式时间内解决以下问题的算法:
我们正在连接bitset中的位:
给定位集的最大连接数是多少?
答案 0 :(得分:4)
我们可以在这里使用动态编程。
状态为(l, r)
- 给定字符串的[l, r]
子字符串。
状态的值是子字符串中匹配符号的最大数量。
基本情况很简单:对于所有小于2的子串,答案为0。
对于所有较长的子串,我们可以做两件事:
不要将第一个符号与任何内容匹配。
将其与某些内容匹配并独立解决两个较小的子问题(它们是独立的,因为不允许交叉)。
那就是它。时间复杂度为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)中解决。