BZOJ3675 Apio2014 序列分割

博客介绍了如何解决BZOJ3675问题,即在一个非负整数序列中分割出k+1个子序列以最大化得分。关键在于理解得分与分割顺序无关,并利用二维斜率优化和分治思想,实现O(nlogn)的时间复杂度解题策略。还提到在已知需要划分的区间数量k的情况下,如何通过枚举和滚动dp数组来找到最优解。
摘要由CSDN通过智能技术生成

Description

小H最近迷上了一个分隔序列的游戏。在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列。为了得到k+1个子序列,小H需要重复k次以下的步骤:

1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列,也就是一开始得到的整个序列);
2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列。

每次进行上述步骤之后,小H将会得到一定的分数。这个分数为两个新序列中元素和的乘积。小H希望选择一种最佳的分割方式,使得k轮之后,小H的总得分最大。

Sample Input &Output

7 3
4 1 3 4 0 2 3

108


Solution
二维的斜率优化题。

这题的难点在于如何理解最后得到的分数与切的顺序无关。可以这么想:从某段序列中间切一刀,两边和相乘,看做左边的每小段区间和右边的每小段区间分别相乘。异侧的区间处理完了,接下来就要处理同侧的区间,此时就采用分治的思想,将问题划归到左区间内和右区间内,这样最后无论如何一定都是得到每个小区间两两相乘的结果。同样,这个中间轴也可以任意变换,最后得到的答案显然是一样的——因为所有不同的递归方式都是在解决同一个问题:得到每个小区间两两相乘的乘积,复杂度还是 O(nlogn) 的。

还有个问题,之前讨论的题目都是不确定划分出多少个区间的解法,现在唯一确定了要划分出几个区间。比较显然的思路就是枚举划分出了几个区间。这样将dp数组滚动一下即可。 方程:

dp[k][i]=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值