设 fi,j 表示第 i 行填 j 后,前 i 行贡献的最大值。我们不考虑初始填过的数之间产生的贡献。
设 ci,j 表示第 i 行中 j 这个数的数量。为了美观,把 ci,−1 记作 ci。
我们有两个转移:
fi,jfi,j←fi−1,j+ci−1×ci,j+(ci−1+ci−1,j)×ci←fi−1,t+ci−1×ci,t+ci−1,j×ci(这两行填相同数字)(这两行填不同数字)
确实,对于满足 ci−1,j=ci,j=0 的 j,即第 i 行和第 i−1 行都没出现的数,有转移:
fi,jfi,j←fi−1,j+ci−1ci←fi−1,t+ci−1×ci,t
如果记 a=ci−1ci,b=1≤t≤kmax(fi−1,t+ci−1×ci,t),这些转移是 x←max(x+a,b),可以用线段树维护 dp 值。
但是怎么快速求 b 啊?