有人可以指导我如何解决这个编程问题吗?似乎是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,这是您可以获得的最大值 给定约束。
答案 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 )
}
}