The Endspeaker (Easy Version)

算法#

题意没什么可以转化的,已经很明确了。

容易发现当 k 确定且要进行移除前缀操作时,一定要尽可能的使前缀更大不然一定不优。

考虑动态规划,令 dpi 表示移除 a 数组的前 i 项所需的最小总成本。

可以发现 dpi 可以从 dpj,0j<i 推出来,令 k 表示最大的 k 使得可以移除 [j+1,i] 这一前缀,如果 k 不存在则跳过这一转移。

但是注意到 k 始终不减,考虑新开一维表示当前的 k

dpi,k=min(dpj,k+mk),0j<i,kk

这个柿子的复杂度是 O(n2m2logm) 的,考虑优化。

手动模拟一下可以发现,kk 条件带来了大量的重复计算,事实上,我们完全可以每次仅仅令 k=k+1 or k

现在我们的转移柿子变成了,

dpi,k={dpx,k+mkdpy,k1+mk

显而易见的,我们需要尽可能的使得 x,y 尽量小,并且满足 Sum(x+1,i),Sum(y+1,i)bk ,二分可以处理。

初始化令 dp0,1=0 ,答案为 mini=1mdpn,i ,特别的,当无法转移到答案时,输出 1

时间复杂度 O(nmlogm)

这里顺手就把 Hard Version 讲一下

注意到如果要统计方案数, 必须要在转移的时候更新区间而非仅仅只更新最优解

我们线段树维护区间修改, 然后统计 i=n 时的选择方案即可


考虑复习

这里只复习 Easy Version , 对方程式的一些优化

还是这个转移, 关于推出这个的方式, 其实更好的理解方法是, 分类成是否将 k 增加 1

dpi,kmin{dpx,k+mk,Sum(x+1,i)bkdpy,k1+mk,Sum(y+1,i)bk

根据定义不难发现, 不妨把 dpi,k 的第二维看做一个定值, 那么 dpk(i) 单调不降
更一般的, 对于 φ(i)=mink=1mdpi,k , 不难发现 φ 函数单调不降, 但是这个没什么用

所以如果我们找出了 x,y 的取值区间, 相当于找到了转移最值

不难发现, 随着 i 增大, 如果一个 x 对于 i<i 都有 Sum(x+1,i)>bk , 必有 Sum(x+1,i)>bk , 有单调性, 所以简单双指针维护可以做到 O(mn)

代码#

总结#

观察题目数据可以大概构想出方程形式,

手动模拟可以找到算法劣在哪里。

这种转移, 考虑每次 +1 处理


一种当 dp 数组对应的函数单调不降 (一般是由于定义, 当然也可以自己推导)trick :
直接通过维护取值区间来维护转移最值

时刻注意单调性

posted @   Yorg  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示