给你
n
n
n个栈,你需要对于每一个栈,从前往后选择若干个,栈中每一个元素有一个贡献,问选择
k
k
k个的最大贡献是多少。
n
≤
3000
,
∑
c
≤
1
e
6
,
k
≤
3000
n\le3000,\sum c\le1e6,k\le3000
n≤3000,∑c≤1e6,k≤3000
Solution
首先考虑单调性,不可能同时有两个栈没有选择完,因为如果有
a
i
>
b
j
a_i>b_j
ai>bj,一定有
a
i
+
1
>
b
j
−
1
a_{i+1}>b_{j-1}
ai+1>bj−1,这样我们就可以把所有的
b
b
b换成
a
a
a。
因此就可以DP了,枚举哪一个没有选择完,然后处理一个前缀DP和后缀DP。
但是这样合并的时间是不行的。
考虑分治,从
[
l
,
r
]
[l,r]
[l,r]到
[
l
,
m
i
d
]
[l,mid]
[l,mid],就
O
(
(
r
−
m
i
d
)
k
)
O((r-mid)k)
O((r−mid)k)把
[
m
i
d
+
1
,
r
]
[mid+1,r]
[mid+1,r]加入DP即可,向右类似。