【问题标题】:Finding a group of subsets that does not overlap找到一组不重叠的子集
【发布时间】:2014-09-15 20:10:54
【问题描述】:

我正在为即将举行的编程竞赛进行复习,并且正在解决以下问题:

给定一个整数列表、一个整数 t、一个整数 r 和一个整数 p,确定该列表是否包含 t 个 3 组、r 个 3 组和 p 对数字。对于这些子集中的每一个,数字必须是相邻的,并且任何给定的数字只能存在于一个子集中(如果有的话)。

目前,我通过简单地查找所有 3 个、3 个运行和对的集合来解决问题,然后检查所有排列,直到找到一个没有重叠子集的排列。但是,这似乎效率低下,我想知道是否有更好的解决方案。

这里有两个问题的例子:

{1, 1, 1, 2, 3, 4, 4, 4, 5, 5, 1, 0}, t = 1, r = 1, p = 2。
这是有效的,因为我们有三元组 {4 4 4}、运行 {1 2 3} 以及对 {1 1} 和 {5 5}

{1, 1, 1, 2, 3, 3}, t = 1, r = 1, p = 1
这不起作用,因为唯一的三元组是 {1 1 1} 并且唯一的运行是 {1 2 3} 并且两者重叠(它们共享一个 1)。

我正在寻找一种更有效的方法来解决这个问题。

【问题讨论】:

  • 必须一组 3 个或一对包含连续的元素?
  • 是的,它们必须是连续的元素。

标签: algorithm optimization subset


【解决方案1】:

可能有更快的方法,但您可以使用动态编程来解决这个问题。计算一个递归函数 F(t,r,p,n),它决定在从位置 1 开始到 n 结束的序列中是否可能有 t 个三元组、r 个运行和 p 对,并存储如果可能,解决方案在位置 n 结束。如果您可以在位置 n 处有一个三元组、运行或对,那么您也有一个递归情况。 F(t-1,r,p,n-3) 或 F(t,r-1,p,n-3) 或 F(t,r,p-1,n-2),你有最后一个子集存储,否则你有一个递归案例 F(t,r,p,n-1)。这看起来像四次方复杂度,但实际上并非如此,因为 n 的值总是在减小,所以复杂度实际上是 O(n + TRP),其中 T 是所需的三元组总数,R 是所需的总数运行,P 是所需的总对数。所以最坏的情况是 O(n^3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多