dp吗,对啊

https://codeforces.com/problemset?tags=dp,2200-2600

CF1701E Text Editor

最优策略显然是从右往左删,再到开头从左往右删。

发现 s s s 被最终结束的位置,按 home 之前的位置分成了 3 3 3 段,记作 a,b,c

需要满足 b b b t t t 的子串,且这个子串左边的是 a a a 的一个子序列,这个子串右边的是 c c c 的一个子序列。

考虑 DP,记 f i , j , k f_{i,j,k} fi,j,k 表示 s s s 的前 i i i 个字符匹配上 t t t 的前 j j j 个字符, k k k 表示当前光标在哪一段。

则有
f i , j , 0 ← min ⁡ ( f i , j , 0 , f i − 1 , j , 0 + 2 ) f i , j , 2 ← min ⁡ ( f i , j , 2 , f i − 1 , j , 2 + 1 ) f_{i,j,0}\leftarrow \min(f_{i,j,0},f_{i-1,j,0} + 2)\\ f_{i,j,2}\leftarrow \min(f_{i,j,2},f_{i-1,j,2} + 1) fi,j,0min(fi,j,0,fi1,j,0+2)fi,j,2min(fi,j,2,fi1,j,2+1)
s i = t j s_i=t_j si=tj
f i , j , 0 ← min ⁡ ( f i , j , 0 , f i − 1 , j − 1 , 0 + 1 ) f i , j , 1 ← min ⁡ ( f i , j , 1 , f i − 1 , j − 1 , 1 ) f i , j , 2 ← min ⁡ ( f i , j , 2 , f i − 1 , j − 1 , 2 + 1 ) f_{i,j,0}\leftarrow \min(f_{i,j,0},f_{i-1,j-1,0}+1)\\ f_{i,j,1}\leftarrow \min(f_{i,j,1}, f_{i-1,j-1,1})\\ f_{i,j,2}\leftarrow \min(f_{i,j,2}, f_{i-1,j-1,2}+1) fi,j,0min(fi,j,0,fi1,j1,0+1)fi,j,1min(fi,j,1,fi1,j1,1)fi,j,2min(fi,j,2,fi1,j1,2+1)

转段

f i , j , 1 ← min ⁡ ( f i , j , 1 , f i , j , 0 ) f i , j , 2 ← min ⁡ ( f i , j , 2 , f i , j , 1 , f i , j , 0 ) f_{i,j,1}\leftarrow \min(f_{i,j,1},f_{i,j,0})\\ f_{i,j,2}\leftarrow \min(f_{i,j,2},f_{i,j,1},f_{i,j,0}) fi,j,1min(fi,j,1,fi,j,0)fi,j,2min(fi,j,2,fi,j,1,fi,j,0)

答案即为 f n , m , 2 + 1 f_{n,m,2}+1 fn,m,2+1

注意判断没用到 home 的情况。

时间复杂度 O ( n m ) \mathcal O(nm) O(nm)

CF1699E Three Days Grace

关于最小极差,考虑枚举最小值,求最小的最大值。

记当前枚举的最小值为 m n mn mn f x f_x fx 表示 x x x 分解成不小于 m n mn mn 后最大因数的最小值,答案即为 max ⁡ x ∈ A f x \max\limits_{x\in A}f_x xAmaxfx

考虑从 m n + 1 mn+1 mn+1 转移到 m n mn mn,发现,只有 m n mn mn 的倍数的 f f f 才会改变,即若 x x x 中含有 k k k m n mn mn,则
f x = min ⁡ ( f x , min ⁡ i = 1 k ( f x m n i ) ) f_x=\min(f_x,\min_{i=1}^{k}(f_{\frac{x}{mn^i}})) fx=min(fx,i=1mink(fmnix))
时间复杂度 O ( m ln ⁡ m ) \mathcal O(m\ln m) O(mlnm)

CF1699D Almost Triple Deletions

考虑线性 DP,记 f i f_i fi 表示区间 [ 1 , i ] [1,i] [1,i] 只剩下 a i a_i ai 这种值,长度最大值。

a 0 , a n + 1 a_0,a_{n+1} a0,an+1 为通配符,则答案为 f n + 1 − 1 f_{n+1}−1 fn+11

转移

f i = 1 + max ⁡ j = 0 i − 1 [ del ⁡ ( j + 1 , i − 1 ) ∧ a i = a j ] f j f_i=1+\max_{j=0}^{i-1}[\operatorname{del}(j+1,i-1)\land a_i=a_j] f_j fi=1+j=0maxi1[del(j+1,i1)ai=aj]fj

其中 del ⁡ \operatorname{del} del 表示区间 [ l , r ] [l,r] [l,r] 能否被全部删完。

有结论:**序列可以被删完当且仅当长度为偶数且众数出现次数不多于序列一半。 **

时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值