序列分割

我们像往常一样考虑如何分组,但是我们发现在计算答案的过程中,当分的组确定的话,答案跟切的顺序是否有关

如果有关的话,那么这个DP将变得非常难,所以我们估计是无关的,但是一下子就证明一般性不太好证,所以我们先手搓几组\(k\)比较小的情况

\(k=2\)的时候,假设最后分的组的每一组的元素和分别为\(a,b,c\),那么就有两种方案,分别为\(a(b+c)+bc\)\(c(a+b)+ab\),展开之后发现是相等的

\(k=3\)的时候也类似地做,而且我们还发现,最终的答案似乎是每个组之间两两组别的乘积相加

形式化地说,设一共有\(n\)个组,每个组的元素和分别为\(a_1,a_2,...,a_n\),那么最终的答案就是\(a_1(a_2+a_3+...+a_n)+a_2(a_3+a_4+...+a_n)+...+a_{n-1}a_n\)

现在我们再来数学归纳法证明,假设当小于等于\(n\)个组时满足上述定理,我们考虑当多了一个组\(a_{n+1}\)的时候

无论第一次从哪个位置切开,假设从\(i\)切开,那么第一次的贡献就是\((a_1+a_2+...+a_i)(a_{i+1}+a_{i+2}+...+a_n)\),然后对新产生的两组利用数学归纳法,会发现最终的答案对任意的数对\((j,k),j<k\),都有\(a_ja_k\)这一项,而且这一项只出现了一次。因为如果\(j≤i\)或者\(k≥i+1\),那么由数学归纳法可以得到存在且仅出现一次,如果\(j≤i<k\),那么由第一次产生的贡献可以得到

然后我们再来考虑推导,不难设出状态\(f[i][j]\)表示对前\(j\)个元素一共操作\(i\)次的最大贡献,我们考虑最后一组,假设由\([k+1,j]\)的元素组成,那么就有\(f[i][j]=f[i-1][k]+(sum[j]-sum[k])*(sum[k])\),其中\(sum\)是前缀和

然后注意这里\(i\)这一维的变化只有\(1\),所以出现了\(j\)\(k\)的乘积项的时候仍然可以考虑斜率优化,剩下的就比较easy了

posted @ 2024-03-03 16:15  最爱丁珰  阅读(4)  评论(0编辑  收藏  举报