序列分割

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

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

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

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

形式化地说,设一共有n个组,每个组的元素和分别为a1,a2,...,an,那么最终的答案就是a1(a2+a3+...+an)+a2(a3+a4+...+an)+...+an1an

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

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

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

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

posted @   最爱丁珰  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示