把2n个人分成n+n两组,那么一共是种情况,如果每一次都暴力计算竞争力总和,那么每一次的时间复杂度将是O(n^2),总时间复杂度是
,对于n≤14这个数据范围来说是过不去的。
考虑如何惰性计算这个竞争力总和,也就是说从状态A转移到状态B的时候根据状态的变化来计算贡献,这是一个常用的思路。
一种很巧妙的思路:算贡献的时候不用加,用减。
假设当前没有分组的变量的竞争值就是,每次将一个元素分到某一组后,这个元素和原来这个组里的所有元素的贡献需要减去,那么在n+n全分配完之后得到的结果就是还没有被“割断”的“边”。这样做有个好处就是有一个可以减枝的条件:如果当前还没有被“割断”的“边”的总和已经小于当前的最大值了,这条路就没有必要继续枚举了,这样就快了很多。
时间复杂度O(