这是一道经典的贪心法。
我们令f[0]=1,然后从左往右扫一遍,保证f[i]与f[i-1]比较时符合要求,即f[i]=max(1, f[i-1]+1 if rating[i]>rating[i-1])
. 这个操作更新了f[i]的下限,是f[i]合法的一个必要条件。言下之意就是说,f[i]不保证是一个合法的分配,但f[i]不能更小了。
然后从右往左扫一遍,保证f[i]与f[i+1]比较时符合要求,即f[i]=max(f[i], f[i+1]+1 if rating[i]>rating[i+1])
. 这个操作同样进一步更新了f[i]的下限,即f[i]不能更小了。
以上两步操作都是必要条件,找到了f[i]的一个下限。但是这个下限本身是否就是符合要求的方案呢?事实上就是如此。上面两轮two pass保证了每个小朋友与相邻两个人做比较时都是公平的。换句话说,任意两个相邻小朋友之间的比较和分配都是公平的。所以此时f[i]的分布同时也是一个充分解。
贴着下限的充分解,就是题目要求的最优解(最少分发总数)。