皇后游戏

先把这个推导看完




现在我们来讲一下总结

首先,我们要观察到ci递增,这样才能更简单,就不用像国王游戏那样在交换前后比较ij的max了(就是说,国王游戏需要比较max(ci,cj)max(cj,ci),但是这道题目就只用比较cjci

然后,这道题目教会了我们如果去掉max中的max(或min中的min):先把外层max外面的项全部移动到外层max里面,然后再对内层max进行类似的操作,最终就可以只保留一个max了

那么为什么这道题目能够消掉y+bi+bj呢?其实就像题解里面说的,数学上是肯定错误的,但是对于这类题目(注意是这类题目,不是这道题目,至于这类是哪一类,见本文最后)是都可以消去的

我们考虑最终的⑤式,如果我们最终的序列满足⑤式,那么肯定是可以推导到①式上面的那一个式子的,那么对这个式子,我们给两个max里面都加上y+bi+bj,肯定也是成立的,而这就是我们最开始推导的那一个式子

就是说,我们按照这种排序规则排序后,最开始的式子就能够被推导出来,就不会出现交换相邻两项出现更优的情况

所以以后遇到这种题,如果是max(a1,a2,a3,....)max(b1,b2,b3,....),如果存在ij,使得ai=bj,我们直接消去这两项即可

然后我们根据这个式子排序(注意cmp函数里面不要加等于号,stl的排序都不要加)后模拟即可

但是,有一个很自然的问题:最终的排序一定是最优的吗?

就是说,最优排序一定满足这个条件,但是满足这个条件的一定是最优排序吗?

答案是否定的

比如下面:

7 3
1 1
1 6

然而还有一种排序也满足条件:

1 1
1 6
7 3

但是前者算出来17,后者算出来12

怎么解决?

首先明白一个定理:任何一个序列都可以通过有限次邻项交换变成任何另一个序列

我们这个时候回到国王游戏这一道题目

这一道题目按照ai×biai+1×bi+1排序,那么中间会存在一些乘积相等的数(就是这个序列被分成了若干个块,每个块之间的乘积严格递增,但是块内的乘积相等),那么最优答案不可能会在块之间进行交换,因为答案会变差(当然最优序列也必须满足以上条件,就是说如果想通过交换邻项去得到更优的情况,一定是在块内交换的),然而在块内交换,由于乘积都相等,每一次交换答案都不变,所以我们任意找一个满足条件的序列就可以了

我们思考一下上面的排序有何特殊的地方:每一个关键字都只跟自身元素有关,而不是像⑤式一样跟前后两项都有关

就是说,如果关键字只跟自身有关,那么排序后关键字肯定就具有传递性,在同一块内任意交换,由于具有传递性,就会导致答案不变,所以任何一个序列都满足题目

这里传递性主要是去满足接下来说的“消除逆序对”。我们通过邻项交换证明出来一个不等式,如果这个不等式没有被满足,就是存在“逆序对”

那么回到皇后游戏,我们要想办法把⑤式变成只跟自身有关的式子,由于只跟自身有关系,所以我们按照每个大臣ab的大小进行讨论

一旦当我们按照上述方法排序后,这个序列是满足⑤式的,每个块中(一共有三个组,每个组里面有若干个块)任意交换都不会改变答案(也可以证明块间交换答案不会更优)

比如在第一组内,交换ii+1,其中ai=ai+1

d=max(ci1,j=1iaj)

交换前:因为dj=1iaj,biai,则有max(d+bi,j=1iaj+ai+1)+bi+1=d+bi+bi+1

交换后:因为bi+1ai+1=ai,则有max(d+bi+1,j=1iaj+ai+1)+bi=d+bi+bi+1

所以前后不变

最后还有一些想说的

我们最开始化出来的⑤式,其实是不能保证最优结果一定符合的,因为这个式子不只是跟自身元素有关,我们只能说明如果不符合这个式子,我们交换后结果不可能变差,然而也可能不会变好,然后我们经过无限次交换都不能消除这个逆序,这完全是可能的

然而通过这个式子,我们推导出了最后的排序方案,这个方案只跟自身元素有关了,于是,我们就可以统计逆序对,这题的逆序对定义为:若iji的大组>j的大组或者ij是同一个组但是两者不符合组内的排序条件,那么(i,j)就是一个逆序对

我们先来考虑最优答案会不会存在有关大组的逆序对,也就是说,我们给每个人分组,a<b的是第一组,a=b的是第二组,a>b的是第三组,假设我们已经获得了一个最优的排序了,这个排序是不可能存在大组编号逆序对的(比如i<ji的大组>j的大组,光看大组编号的话,这个逆序对关系显然具有传递性,因为组的编号也只跟自身ab的相对大小有关,于是有逆序对就一定有相邻逆序对,即i的大组>i+1的大组,我们交换ii+1就可以消除一个大组逆序对,可以证明答案不会变差)

经过上面的分析,最终的最优答案一定不会包含大组逆序对,我们再对每个大组进行排序,通过类似分析也可以消除剩下的逆序对(这个逆序对就不是大组逆序对了,因为前面大组逆序对已经被消除了,这个逆序对是ij是同一个组但是两者不符合组内的排序条件的逆序对,很显然这个逆序对也有传递性,因为此时第一维a已经固定了,我们只用看与自身有关的第二维b就好了),从而得到最终的序列(注意最终的序列在块内随意交换答案都不变了,所以我们随便找一个最终的序列就好了,这一定是最优的序列)

为什么我们最开始要以ab的相对大小作为划分依据呢?应该是经验吧,而且此时注意,这样一定会分出大组,对于其他类似的题目,我们都像上面这样分析,即先考虑消除大组逆序对,再考虑消除组内逆序对

我们再回头看看国王游戏,如果已经找到了一个最优方案而且这个最优方案有逆序对,那么可以通过相同的方法消除所有逆序对来得到一种最优方案

所以总结一下这类题目:给你一个序列,每个元素有若干个属性,让你对这个序列任意排序,使得最大量最小或者最小量最大,那么就可以通过领项交换先得出一种最优式子,如果这个式子与前后两项有关(比如皇后游戏),想办法化作只与自身有关,然后就可以利用逆序对的传递性来解决问题了

update 2024.7.21

重新做的时候做出来了,但是解释新发现了一个疑问(幸好立马解决了):这里列式子只考虑了邻项,但是后面的c也可能会因为前面的c的变化而变化,为什么不用考虑?实际上,显然对于后面的c来说,前面的c越小越好,所以我们最后搞出来了一个充分条件,让c尽量小就好了

前面说的可以去掉y+bi+bj,实际上就是在找充分条件。数学上进行消元找的都是充要条件,但是这里我们做题只用找出充分条件。当然有些时候消掉相同项也不是说就能找出充分条件了,但是我们可以这么尝试一下,如果能够尝试出来,就可以通过消掉相同项化简

posted @   最爱丁珰  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示