Algorithm 查找一组不重叠的子集

Algorithm 查找一组不重叠的子集,algorithm,optimization,subset,Algorithm,Optimization,Subset,我正在为即将到来的编程竞赛复习,正在解决以下问题: 给定一个整数列表、一个整数t、一个整数r和一个整数p,确定该列表是否包含t组3、r组3和p对数字。对于这些子集中的每一个子集,数字必须是相邻的,并且任何给定的数字只能存在于一个子集中(如果有的话) 目前,我正在解决这个问题,只需找到3的所有集合、3的运行和对,然后检查所有置换,直到找到一个没有重叠子集的置换。然而,这似乎效率低下,我想知道是否有更好的解决方案 以下是两个问题示例: {1,1,1,2,3,4,4,4,5,1,0},t=1,r=1,

我正在为即将到来的编程竞赛复习,正在解决以下问题:

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

目前,我正在解决这个问题,只需找到3的所有集合、3的运行和对,然后检查所有置换,直到找到一个没有重叠子集的置换。然而,这似乎效率低下,我想知道是否有更好的解决方案

以下是两个问题示例:

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

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


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

可能有一种更快的方法,但是你可以用动态规划来解决这个问题。计算一个递归函数F(t,r,p,n),该函数决定在从位置1开始到n结束的序列中是否可能有t个三元组、r个运行和p对,如果可能的话,存储在位置n结束的解的最后一个子集。如果可以有一个三元组、run或pair结束于位置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)在最坏的情况下。

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