需要通过动态编程帮助制作团队LINEUP

时间:2012-12-27 06:14:58

标签: algorithm dynamic-programming

想象一下,你是一名足球队教练。球员在场上有11名球员和11个不同的位置。每个玩家都能够在指定位置以一定等级在所有11个不同位置上玩。

作为球队的教练,你必须为球队(由所有11名球员组成)决定最强的LINEUP,以便最大化整体评分(即评分总和)。 没有两个球员可以在同一个位置上比赛。

举个例子,考虑一个较小的LINEUP问题,其中只有3个玩家玩某种游戏。

3 2 1
4 1 5
6 7 3

玩家1可以在等级3的位置1,等级2的位置2和等级1的位置3玩。类似地,对于所有玩家,第i列表示他们在第i位置的等级。最好的LINEUP将是玩家1在位置1,玩家2在位置3和玩家3在位置2时播放,导致最大评级= 15(3 + 5 + 7)。

那么,动态编程如何解决这个问题呢?我在论坛上读过有人用DP解决这个问题,但我无法弄清楚问题是如何拥有最佳子结构的。所以请帮我弄清楚....

Plz还提到DP是否有可能解决问题

请妥善编辑标题......

2 个答案:

答案 0 :(得分:2)

我相信你在这里有一个任务问题,可以通过Hungarian Method来解决。

如果你真的想要一个DP解决方案,这里有一个想法。为什么没有F[i,j]i=0..11j = 0..2^11-1i - 允许您选择的玩家数量,j - 是一个位掩码,代表所覆盖的字段位置,F是您可以获得的最大“团队价值” 。例如,对于i = 1,只有那些二进制表示最多包含一个设置位的j值才是“有效”。显然,只有一名球员,你不能转换多个位置。

// initialize the F[][] array with -infinity
F[0][0] = 0;

for(i = 1; i <= 11; ++1)
{
  for(j = 0; j < 2^11; ++j)
    for(k = 0; k < 11; ++k )
    if( (j & (1 << k)) == 0 ) // k-th position is not occupied?
      F[i][j | (1 << k)] = max( F[i][j | (1 << k)], F[i-1][j] + <value of payer i playing at position k> );
}

ANSWER = F[11][2^11-1]

这显然可以进行优化:对于F[i],我们只对包含i个设置位的位掩码感兴趣。

通过用位图表示可能的状态,有一个将组合问题转化为DP问题的技术的名称,但我不记得了。对此的正确解决方案仍然是匈牙利方法。

答案 1 :(得分:0)

这是一个匹配问题。 你可以使用KM算法来解决wiki 亚历克斯提到的匈牙利方法是KM的一个特例。 对于DP方法,Ales给出了正确的答案。由于玩家数量不大,这里可以使用一点操作方法