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,0←min(fi,j,0,fi−1,j,0+2)fi,j,2←min(fi,j,2,fi−1,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,0←min(fi,j,0,fi−1,j−1,0+1)fi,j,1←min(fi,j,1,fi−1,j−1,1)fi,j,2←min(fi,j,2,fi−1,j−1,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,1←min(fi,j,1,fi,j,0)fi,j,2←min(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 x∈Amaxfx。
考虑从
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+1−1。
转移
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=0maxi−1[del(j+1,i−1)∧ai=aj]fj
其中 del \operatorname{del} del 表示区间 [ l , r ] [l,r] [l,r] 能否被全部删完。
有结论:**序列可以被删完当且仅当长度为偶数且众数出现次数不多于序列一半。 **
时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)。