二分法求LIS的本质并不是二分,而是存储整个序列数据的数组f[n]。
我们考虑到,f[i]实际上是长度为i的上升序列的"最后一个值",那么我们把他们拟人化,看看他们自己希望怎么更新。
假设我是f[3]=4,我的好朋友是f[4]=6。那么,如果“我”可以通过拓展一个大于我末尾的数字来更新自己,那我肯定是希望自己最后长得尽量长。
换句话讲,我现在的大小为4,长度为3;朋友的大小为6,长度为4。
假设不考虑其他人,只考虑对“我”和“朋友”进行更新,然后提供了一个为5的值。
这时我们发现,我可以通过这个值升级到长度为4,而且朋友的"DNA"不如我的优秀,因为从贪心的角度考虑,我能继续更新的“概率”必然是大于朋友的。因此,此时进行优胜劣汰,让我的“复制体”替代好朋友,即f[4]=5。
单调递增的性质很容易证明:f[1]就是min{f[i]},而f[2]必须大于f[1]才能更新,以此类推。
那么,剩下的问题就在于,二分到某个位置,并进行上述所说的更新后,会不会没有更新完全?换句话讲,后面或者前面可能还有一大堆序列需要更新,但我们只更新了一个,这样会不会导致答案出现严重问题?
对于前面的序列,可想而知一定比我们小,那我们设身处地地想一下,我们是f[2]=1和f[3]=2,此时有个100来问我要不要更新自己,那f[2]肯定不乐意更新,f[3]更不乐意,只有确实有可能“接受”这个数字的“人”,才能更新。比如提供一个Interger.MAX_VALUE,肯定只能更新f[m+1](m为求解过程中当前求到的LIS长度(非最终答案))。
那对于后面的序列呢?不好意思,你确实“有可能更新”,可是问题在于,你的“政治位置”不够精准,“资格不够老”,不能更新。
比如目前是f[4]=10,f[5]=20,f[6]=30,尝试更新一个15,问题在于既然f[5]=20,那么对于长度为6的序列来说,他能找到的最好的“女朋友”(长度为5的最优序列),第5个数字最小也得是20,15是没办法排在他后面的。因此,我们如果想要“改革”,只能慢慢做起(先更新一个数字,慢慢转化全局)。