最大收藏

时间:2015-11-15 05:35:41

标签: algorithm dynamic-programming

Mark有一系列 N 邮票。每个标记属于某种类型,它们被枚举为正整数。更有价值的邮票具有更高的枚举类型。

在任何特定的日子,E-bay列出了几个优惠,每个优惠都表示为无序对{A,B} ,允许其用户交换类型A <的邮票/ strong>具有相同数量的 B型标记。马克可以使用此类优惠在网站上张贴任意数量的 A型邮票,并获得相同数量的 B型邮票作为回报,或者相反。假设Mark想要的任何数量的邮票总是可以在网站的交易市场上获得。每个优惠只在一天内开放:马克不能在这一天之后使用它,但他可以在这一天使用它几次。如果在某一天有一些活动,Mark可以按任何顺序使用它们。

在完成(接受或拒绝)所有优惠后,查找其收藏品的最大可能价值。 Mark集合的值等于集合中所有戳记的类型枚举之和。

动态编程如何导致问题的解决方案? (马克知道将来会有什么提议)

2 个答案:

答案 0 :(得分:0)

动态编程意味着将问题简化为较小的问题子序列。您的问题被明确定义为不同类型的邮票的有序集合。那么,价值(T1)&lt;值(T2)..值(Tn-1)

查找集合的最大值将取决于交换类型对的机会。当然,我们只想交换对,因为它会增加集合的总价值。

因此,我们定义一个简单的交换操作,如果集合在交换机会中包含较低值戳记的戳记,我们将交换。

如果提供了不同类型的足够机会,那么该集合最终可能包含所有最高价格的邮票。

我的建议是创建一个集合数据结构,一个简单的条件交换函数,以及一个响应交换事件的事件队列。

Dynamic Table

看一下这个图表,它显示了我如何设置数据。关键是从最后一行开始,然后向后计算最优惠的价格,然后向前迈进并继续前进。

答案 1 :(得分:0)

我会维护一个表,为每种类型提供仅使用最后N个交换为该类型成员获得的最大值。

要计算N = 0,只需记下每种类型的值而不用交换。

要计算N = i + 1,请查看第i个交换,并查看N = i的表。第i个交换用于该表中的两个偏移,其可能具有不同的值。因为你可以使用第i个交换,你可以改变表格,将两者的较低值设置为等于两者的较高值。

如果你有一张表考虑了所有掉期,你可以总结Mark开始的类型的值来得到答案。

互换{4,5},{5,3},{3,1},{1,20}的示例表

1 2 3 4 5 .. 20

20 2 3 4 5 .. 20

20 2 20 3 4 .. 20

20 2 20 3 20 .. 20

20 2 20 20 20 .. 20

交换{1,5}然后{1,20}

的示例

1 2 3 4 5 .. 20

20 2 3 4 5 .. 20

20 2 3 4 20 .. 20

请注意,i = 1表示考虑到最后一次交换可能,因此就交换而言,我们正在倒退。最后一个表反映了这样一个事实,即在交换20之前,5可以交换为1。通过查看在时间i可用的交换以及此时哪些表条目发生变化,可以计算出交换的时间表。