【问题标题】:Need help making team LINEUP by dynamic programming需要帮助通过动态规划制作团队阵容
【发布时间】:2012-12-27 06:14:57
【问题描述】:

假设您是一名足球队教练。球场上有11名球员和11个不同的位置。每个玩家都能够在指定位置以一定等级在所有 11 个不同位置上进行比赛。

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

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

3 2 1
4 1 5
6 7 3

玩家 1 可以在排名 3 的位置 1、排名 2 的位置 2 和排名 1 的位置 3 上玩。同样,对于所有玩家,第 i 列代表他们在第 i 位置的排名。最佳阵容是当球员 1 在位置 1、球员 2 在位置 3、球员 3 在位置 2 时,最高评分 = 15 (3 + 5 + 7)。

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

也请提一下DP能不能解决问题

请适当编辑标题...

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    相信你这里有赋值问题,可以通过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 问题的技术有一个名称,但我不记得了。解决这个问题的正确方法仍然是匈牙利方法。

    【讨论】:

    • 感谢您的回复。学到了一些新东西以及关于最佳子结构的知识
    • @khirod,我不确定您所说的最佳子结构是什么意思,但我概述了一个“cheat-DP”解决方案。希望对您有所帮助。
    • 此外,所有子阵容r 可以通过重复减去 j 中的最低 1 位,在 O(number_of_1_bits_in_j) 中找到,使用技巧 j &amp; -j 找到这个最低 1 位:) 这意味着将 k 循环替换为仅遍历这些位的循环。
    • 现在看起来像是广度优先搜索。对于每个位掩码,我们可以通过设置一个新位来获得所有其他位掩码:我们反转位掩码并应用j &amp; -j 技巧。自然地,从位掩码 0 发现的位掩码将包含一个位集,位掩码的下一个“波”将包含 2 个位,等等……但此处仍应应用匈牙利方法。 8 - )
    • @j_random_hacker,我正在考虑消除 j 上的循环。就像 Dijkstra 算法一样。我们将需要一个数组 F[0 .. 2^11-1]、一个位向量 Visited[0..2^11-1] 和两个位掩码列表:lCur 和 lNext。最初 lCur={00000000000},lNext={}。然后for (i=0;i&lt;11;++i) { for(&lt;bitmap B in lCur&gt;) { for (&lt;bits X not set in B&gt;) { F[B&amp;X]=max(F[B&amp;X],F[B]+...); if(!Visited[B&amp;X]) {lNext += B&amp;X; Visited[B&amp;X]=true;} } } lCur=lNext; lNext = {}; }希望这出来可读...
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2020-01-10
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      相关资源
      最近更新 更多