从数字列表开始的动态编程方法(使用伪代码)

时间:2016-11-30 08:31:27

标签: algorithm dynamic-programming

说明方法的运行时间。期望多项式时间算法。

俱乐部想为学生组织一个派对。但是,只有部分学生可以参加 派对。候选人按照以下要求成对选择:假设 学生排队,每个学生都有一个幸运号码,有些学生可能有 同样的幸运数字。俱乐部要求只有拥有相同运气号码的学生才可以 配对并参加聚会,而所有学生在所选择的一对中将失去 机会。 我们已帮助俱乐部正式制定问题。 给定一系列正整数(表示幸运数字)A = (a1, a2, ... an),一对(ai, aj)被定义为ai=aji<j的跳舞对。跳舞对列表L = {(1,1),......(,)} 当且仅当对于任何两对(,),(,)L,jx<iyjy<ix 1 ≤ , ≤ 时,这是好的。

例如,如果A = {1,3,4,1,2,3,2,4,3,5,3,4,5},一些好的舞蹈列表可能是:

{(1,1),(2,2),(3,3)}(位置A = { 1 ,3,4, 1 2 ,3, 2 ,4, 3 ,5, 3 ,4,5}}

{(1,1),(3,3)(5,5)}(位置A = { 1 ,3,4, 1 ,2 , 3 ,2,4, 3 5 ,3,4, 5 })

a)给定一系列正整数A,设计一个多项式时间算法来找到a 良好的舞蹈配对列表,最大数量的舞蹈配对。

b)假设跳舞对(ai, aj)的重量为ai+aj。一个好跳舞的总重量 list是列表中跳舞对的所有权重的总和。设计多项式时间 算法找到一个具有最大总重量的好跳舞对列表。

对于a部分, 如果我这样写

foreach list L
    foreach item I in list L
        foreach list L2 such that L2 != L  
            for each item I2 in L2
                if I == I2
                    return new 3-tuple(L, L2, I) //

如何继续?

0 个答案:

没有答案