如何解决高级编码竞赛中提出的这个问题?

时间:2019-10-06 19:11:27

标签: algorithm dynamic-programming knapsack-problem greedy

有人可以指导我如何解决这个编程问题吗?似乎是DP问题,我找不到答案。

问题:

  

有“ n”个广告。每个广告都有一个与   它以大小为'n'的数组给出,格式为[v1,v2,...,   vn],其中“ v1”是第一个广告的效果值,“ v2”是   第二个广告的有效性值,依此类推。该节目在其中   这些广告的长度为“ m”(从0到m),   并以[[a1,   b1),(a2,b2),…,(an,bn)],其中数组中的第一个元组表示   第i个广告的时间格式(开始时间,结束时间)。注意   任何“ ai”和“ bi”都不能小于0且不能大于   ‘m’。选择展示广告时,您不能在其中展示其他广告   结束了4分钟因此,如果您选择显示具有时间的广告   如(2,4),则您不能在9之前显示另一个广告,因此下一个广告   不能为(8,10),但可以为(9,12)。您必须选择广告   向观众展示,使您最大程度地增加   鉴于上述限制,广告的有效性值。对于   例如,如果“ m”为20,并且广告的时间为[(2,3),(6,9),   (10,12),(12,13),(14,17)],有效值为[3,9,   10、6、7],则您可以展示广告2和广告5(基于索引的索引),   有效性值为16,这是您可以获得的最大值   给定约束。

1 个答案:

答案 0 :(得分:0)

您的问题可以简化为以下问题,让我们考虑一维线段,它们可以描述为(start_i,end_i,value_i)。

S =可用的1d个分段的数组

我们想要的是找到不相交的线段,这些线段的总和为最大可能值,并适合在[0,m](显示长度)区间内

让DP [x] =可用段1d段的子集覆盖段[0,x]的最佳可实现值。

递归关系是,给定一个元素(s_i,e_i,v_i),我们可以选择或不选择它。

DP [e_i] = DP [e_i-1]

DP [e_i] = max(DP [e_i],DP [s_i-1] + v_i)

dp[0] = 0;
// sort the events by increasing e_i, because
// we want to process first the events that finish earlier

for( int END = 1; END <= m; ++END)
{
    dp[end] = dp[end - 1];
    for( each ELEMENT(s_i, e_i, v_u) with (e_i == END) )
    {
        dp[end] = max( dp[end], dp[s_i - 1] + v_i ) 
    }
}