设
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 值。