题目传送门
题目
给定一个长为 \(n\) 的正整数序列 \(a_1,⋯,a_n\) 。
你可以进行若干次操作,每次操作你可以选择一个位置 \(i∈[2,n−1]\) 使得 \(a_i= \frac{a_{i−1}+a_{i+1} }{2}\),随后将 \(a_i\) 删去,之后的数按顺序向前补空位。
求若干次操作后序列长度最小可以是多少。
题解
现在我已经可以想到差分了,把数组差分后,问题转化为每次合并两个相邻相同的数为它们之和,那就有一些性质:每次合并后这个数相当于变成原来的两倍,所以一个数只会和它的\(2\)的幂次倍合并,一个数被合并的次数为\(log\) 次。
我没做出来的原因是因为忘记了一个“决策”的概念,而一味的在想如何线段树dp,线段树dp的问题在于,我只记录上一个块的大小, 但是这个块和上一个合并之后还能继续往前合并, 这个东西不好记录也不好转移,导致我的思路完全错了。
实际上呢,最终合并出来的序列,每个块都是由一段连续的块合并出来的,我们把要合并出这个块,看作那一段块中最后一个的决策,这样就可以进行转移了,同时一个块至多合并\(log\)次, 所以只有\(log\)种不同的决策,复杂度也是正确的。
具体来讲我们设\(f_i\)表示前 \(i\) 个数合并出的最小块数, 转移次枚举第\(i\)个块被合并了多少次即可。
然后这里还要一个很妙的dp, 记 \(g_{i, j}\) 表示第\(i\)个块往左合并\(j\)次需要的左端点, 转移一下即可。
学到了