你能解释一下算法来解决这个问题吗? http://community.topcoder.com/stat?c=problem_statement&pm=6708&rd=10000。这里给出了解释,但很难理解http://community.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm320
答案 0 :(得分:0)
我相信你不理解“解决方案”并不可惜,因为它是在没有提供基本细节的情况下解释的......它也是不正确的。
首先,无论您是从头开始还是向前搜索最佳解决方案,或者从最后开始搜索并向后开始,都应该没有真正的重要性。当然,有一点点差异,因为如果约翰设法在比赛结束时间之前完成比赛任务,那么他可能仍能赶上下一场比赛。因此,如果方向很重要,那么他应该从开始时间开始他的计划并且应该继续前进,因为在结束时他也可以获得参加其他比赛的可能性。让我们不要过于深入细节,因为这个小小的差异对于这个小任务并不重要,只有在一个严肃的项目中才会有用。
我对解决方案一直很苛刻,因为我称之为不正确。我会再说一遍:这是不对的。如果再次查看伪代码并忘记优雅的向后方向(这可能对其他问题有用,但不在此处),您会注意到在迭代到某个时间时选择或不选择竞赛。想象一下,当一场比赛发生在一天的时间段内,但约翰可以同时参加其他四场比赛,所以他应该选择参加长期比赛还是参加其他四场比赛。让我们假设约翰很有可能赢得长时间的比赛,并且更有可能赢得其他四场比赛。在给出的迭代中,我们只能看到在一场或两场较短的比赛被争夺后,长期比赛或其他四场比赛是否是更好的选择。
回溯解决方案,通过生成所有可能的场景并找到最佳选择肯定会解决问题,但它会具有指数复杂性。
“然后可以向后计算A [s]的值。” 是的,它可以向后计算。但作者是否有任何理由为什么要向后计算,为什么向后计算这个是更好的选择呢?是的,动态编程中常见的方法是向后攻击问题,在很多情况下有一个原因,但老实说我没有看到任何有效的理由我们为什么要向后计算它,因为问题几乎是对称的时间,“前进”和“后退”之间的唯一区别是时间的开始和时间的结束,这只是两个常数。
让我们详细说明前面给出的例子。我们假设有五场比赛:
如你所见,每次比赛1.比第2,第3,第4和第5场比赛更具吸引力。但它们在一起比比赛1更具吸引力。
因此,具有指数复杂度的算法要好得多。这很慢,但是,嘿,与给出的“解决方案”相比,这是正确的。如果你想要一个解决方案,那么你可以在这里停止阅读。如果您想听到更好的解决方案,请继续阅读。
让我们假设我们定义了“排除”的逻辑运算符,它是对称的。如果比赛C1排除比赛C2,则C2也排除C1。
让我们进一步假设您在阅读输入时也构建了一个包含排除集群的数据结构:每个集群都是最大的竞争集合,其中每个C1和C2可以直接或传递地相互排除。您可以使用divide et impera找到每个群集的最佳解决方案,当您知道所有群集的解决方案时,完成工作所需的唯一任务是合并子结果以获得整个结果。