题意:
给定正整数序列x1,...,xnx_1,...,x_nx1,...,xn
(1)计算其最长不下降子序列的长度 sss。
(2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列。
(3)如果允许在取出的序列中多次使用 x1x_1x1 和 xnx_nxn,则从给定序列中最多可取出多少个长度为 sss 的不下降子序列。
分析
第一问,普及组问题。
第二,三问,要用网络流解决。
第二问
建立超级源点 SSS 和超级汇点 TTT
我们为了让 SSS 到 TTT 的路径是一条满足长度为 sss 的最长不下降子序列,于是要将 fj=fi+1f_j=f_i + 1fj=fi+1 的 iii 向 jjj 连一条边。这样子从 sss 到 ttt 的一个流表示的是一个长度为 sss 的最长不下降子序列。
可问题来了,每个点只能走一次,这个怎么解决呢?
有一个常用的技巧,就是将点变成边,具体实现是将点变成拆成两个点,中间连一条容量为 111 的边,表示这条边只能走一次。
然后连边细节如下:
①:对每个点 iii,从 iii 到 i′i

本文介绍如何利用网络流算法解决最长不下降子序列的第二、三问。首先,对于第一问,是普及组问题。第二、三问通过建立超级源点和超级汇点,并将点变成边来限制每个元素只能使用一次。详细说明了连接边的规则,并给出了代码实现。
最低0.47元/天 解锁文章
465

被折叠的 条评论
为什么被折叠?



